2012-08-06 23 views
7

Zastanów się, czy mam pewne abstrakcyjne klasy i samochody, ciężarówki, motocykle klasy abstrakcyjne, które wywodzą się z Vehicle, abstrakcyjnychVehicle. Wyobraź sobie również, że muszę być w stanie stworzyć oparty na paliwie samochód lub samochód elektryczny i tak dalej dla ciężarówek i motocykli. (beton klasy)Jak utworzyć polimorficzną metodę z różnymi sygnaturami?

dwa pytania:

1.Consider że chcę wypełnić energię w pojeździe, nie wiedząc, co to jest, w sposób polimorficznych. Na przykład, jeżeli pojazd jest w oparciu paliwa Chcę wypełnić go z paliwa i metoda powinna być z 3 parametrów:
void FillUpEnergy(EfuelType i_fuelType,int amounOfEnergy, int maxAmountOfEnergy)

ale electricy oparty pojazdu muszę prawie taką samą signture funkcji, ale tym razem bez rodzaju paliwa Oczywiście, dla przykładu (2) parametry:

void FillUpEnergy(int amounOfEnergy, int maxAmountOfEnergy) 

mogę zrobić polymorhic FillUpEnergy metodę z powyższych ograniczeń? (podpisy inną metodę'S)

2.In moim realizacji wszystkich konkretnych klas posiadać odniesienie do Engine (inna klasa abstrakcyjna), które reprezentują FuelEngine lub ElectricEngine (inne konkretne zajęcia mam, które wynikają z silnika). Na przykład mam konkretną klasę o nazwie ElectricCar, która zawiera odniesienie do ElectricEngine.
Czy ta architektura jest wystarczająco dobra, czy istnieją lepsze sposoby na wdrożenie systemu garażowego? (chodzi o projektowanie obiektowe etc ..)

+1

Nie dość dostać 1) dla 2 osób), to się nazywa most i jest to jeden z wzorców projektowych. –

+0

Wzór mostu był również moją pierwszą myślą. –

Odpowiedz

8

Nie można dokonać polimorficzny metody z różnych podpisów „push-style”, ale można zrobić polimorficzny „pull-style” metodę z wykorzystaniem dobrze nagłośnione Visitor Pattern.

Chodzi o to, aby odwrócić kolejność interakcji i niech przedmiotem samochód zdecydować, co zrobić: Zamiast nazywać FillUpEnergy i dając samochód, co myślisz, że potrzebuje, zadzwoń FillUpEnergy i niech samochodu podjęcia co on wie, że musi coś takiego:

interface IEnergyProvider { 
    void TakeFuel(EfuelType i_fuelType, int amounOfEnergy); 
    void TakeElectricity(int amounOfEnergy); 
} 
interface ICar { 
    void FillUpEnergy(IEnergyProvider provider); 
} 

teraz podpis swojej polimorficznych metodą jest stała, ale wysyłka metody trwa dwie nogi zamiast jednego:

  • zadzwonić myCar.FillUpEnergy(myProvider)
  • Samochód nazywa myProvider.TakeFuel lub myProvider.TakeElectricity
+2

dobra odpowiedź! Miss stary avatar choć – dash

+1

, ale nie jest gościem tutaj niepotrzebny kompleks? Jeśli chodzi o to, że pobieranie energii elektrycznej i przyjmowanie jakiegokolwiek innego paliwa brzmi jak ta sama koncepcja ... –

+0

@Sebastian Masz absolutną rację co do wzoru gościa: może łatwo wymknąć się spod kontroli, zwłaszcza jeśli chcesz zachować rozciągliwość. Ale w przypadkach hierarchii, które można określić z góry, takich jak ta, nie powinna to być wielka sprawa: tylko z garstką metod, przechodzenie przez interakcje w twoim umyśle pozostaje łatwe. Jeśli chodzi o zasilanie gazem i elektrycznością będące tą samą koncepcją, myślę, że projekt odzwierciedla to poprzez zapewnienie jednej metody "FillUpEnergy". – dasblinkenlight

3

Odnośnie zapytania 1)

Można zrobić elektryczną część/benzyna z fueltype i obsłużyć to w logice domeny.

C# nie oferuje polimorfizmu z różnymi sygnaturami.

2) nazywa Skład

0
  1. Nie można tego zrobić, ponieważ byłoby to dokładnie naruszenie hermetyzacji.
  2. Nie rozumiem twojego pytania dotyczącego silników, ale z pewnością mogę powiedzieć, że istnieje wiele lepszych sposobów na wdrożenie "systemu garażowego" tylko dlatego, że istnieje tak wiele różnych "systemów garażowych". Co w rzeczywistości oznacza, że ​​nie powinieneś próbować modelować swojego systemu (w kategoriach OOP lub innych warunków), dopóki nie zrozumiesz swoich wymagań.
1

Co różni ElectricCar od FueledCar? Nic tylko silnik (koncepcyjnie):

interface IEngine 
{ 
    void FillUpFuel(int amountOfFuel, int maxAmountOfFuel); 
} 

class ElectricEngine : IEngine 
{ 
    public void FillUpFuel(int amountOfFuel, int maxAmountOfFuel) { ... } 
} 

abstract class Vehicle 
{ 
    public abstract IEngine Engine { get; } 
} 

class Car : Vehicle 
{ 
    public IEngine _engine; 
    public override IEngine Engine { get { return _engine; } } 

    public Car(IEngine engine) 
    { 
     _engine = engine; 
    } 
} 
... 
var electricCar = new Car(new ElectricEngine()); 
electricCar.Engine.FillUpFuel(40, 70); 

Przykład typowego składu a przykład dziedziczenia. Nazwanie jest trochę dziwne, gdy ElectricEngine zapełnia paliwo ... ale nie o to chodzi.

0

O 1)
sens posiadania FillUpEnergy polimorficzny (subtype polymorphism) jest w stanie wywołać tę metodę, gdy jedyną rzeczą, wiesz, że obiekt jest Vehicle.

Jeśli chcesz poznać dokładny typ, aby wybrać prawidłowy zestaw argumentów, nie ma potrzeby, aby ta funkcja była polimorficzna.

O 2)
Nic nie jest szokujące

Powiązane problemy