Polimorfizm, jak lepiej?

0

Klasa bazowa : CPojazd.
Klasy pochodne: CAmfibia, CSamochod.

Klasy posiadają tam swoje jakieś atrybuty, ale to nie jest istotne. Istotne są ich metody, w klasie bazowej:

public virtual void dodaj_pojazd() { }

oraz analogicznie :

public virtual void wyswietl_pojazd() { }

Natomiast w klasach pochodnych :

public override void dodaj_pojazd() { }

oraz analogicznie :

public override void wyswietl_pojazd() { }

Pytam o to jak rozwiązać to zadanie najlepiej pod względem polimorficznym. Potrzebuję dodawać do tablicy obiektów CPojazd, jej obiekty pochodne czyli z klas CAmfibia, CSamochod itd.

Mój pomysł :

CPojazd [] Pojazdy = new CPojazd [5]; 

CAmfibia Amfibia = new CAmfibia();
Amfibia.dodaj_pojazd();
Pojazdy[0] = Amfibia;
....

I tak dalej działać w ten sposób, że najpierw tworzę obiekt klasy, którą chcę dodać. Wykorzystuję w tym celu metodę wirtualną dodaj_pojazd, która przecież wie Od razu na jakim obiekcie pracuje, na obiekcie pochodnym czyli CAmfibia, także jakim w tym wszystkim jest polimorfizm? Chyba żaden?

Mój pomysł drugi :

CPojazd [] Pojazdy = new CPojazd [5]; 

Pojazdy[0].dodaj_pojazd();
....

No i tutaj niby pojawia się polimorfizm, tylko w gruncie rzeczy chyba żaden, bo użyta zostanie metoda wirtualna z klasy bazowej i powstanie obiekt bazowy, a ja przecież tego nie chcę?

Mój pomysł trzeci:

List<CPojazd> Pojazdy = new <CPojazd>(); 

CAmfibia Amfibia = new CAmfibia();
Amfibia.dodaj_pojazd();
Pojazdy.Add(Amfibia);
....

Korzystam tutaj z kolekcji i chciałem tak zrobić od początku, ponieważ podoba mi się uniwersalność. No ale, tutaj sytuacja podobna do tej pierwszej. Znowu metoda wirtualna zostanie użyta domyślnie z obiektu pochodnego Amfibia.

I teraz pojawia się pytanie, czy przy takim dodawaniu obiektów do struktury złożonej jakimi są tablice, listy - w przykładach, które podałem działa tutaj pojęcie polimorfizmu? Czy tylko kiedy będę wyświetlał z pomocą w/w metody : public override void wyswietl_pojazd() { } i zadziałam tak :

 foreach (int i in Pojazdy) Pojazdy[i].wyswietl_pojazd();

Proszę o rozwianie moich wątpliwości i uwagi.
Dziękuję.

0

Coś ty się tak uparł na ten polimorfizm?;) Za barzo kombinujesz. Metoda dodaj_pojazd() nie jest do niczego potrzebna i wprowadza w błąd. Bo jak ty chcesz dodać pojazd do już istniejącego obiektu klasy CSamochod? Dodajesz do tablicy, a nie do samochodu. Pomysł z lista jest tu bardzo dobry po wywaleniu tej dziwnej metody. Może to wtedy wyglądać np. tak:

List<CPojazd> pojazdy = new <CPojazd>(); 
pojazdy.Add(new CAmfibia());
pojazdy.Add(new CSamochod());
....

Metoda wyswietl_pojazd() ma już dużo więcej sensu i od biedy może zostać, chociaż da się zrobić wyświetlanie trochę ładniej.

0

Ale ja chciałbym w tej metodzie dodaj_pojazd wypełnić atrybuty obiektu, nadać im jakieś wartości. Czyli pozostaje mi wykorzystać konstruktor i :

List<CPojazd> pojazdy = new <CPojazd>(); 
pojazdy.Add(new CAmfibia(ufo13, szybka, 120));
pojazdy.Add(new CSamochod(ferarri,120,ultradoładowanie)); 

Przy dodawaniu raczej nie wykorzystam pomysłu polimorfizmu, dopiero wyświetlanie da mi taki efekt, ponieważ użyję Listy i dla każdego jej elementu tą samą metodę. Wtedy program sam zorientuje się, której metody z jakiej klasy użyć do wyświetlenia, prawda?

0
thed napisał(a):

Ale ja chciałbym w tej metodzie dodaj_pojazd wypełnić atrybuty obiektu, nadać im jakieś wartości. Czyli pozostaje mi wykorzystać konstruktor i :

List<CPojazd> pojazdy = new <CPojazd>(); 
pojazdy.Add(new CAmfibia(ufo13, szybka, 120));
pojazdy.Add(new CSamochod(ferarri,120,ultradoładowanie)); 

Konstruktor właśnie do tego służy, żeby zainicjalizować obiekt jakimiś domyślnymi wartościami. Dodatkowo możesz też użyć propercji:

List<CPojazd> pojazdy = new <CPojazd>();
CAmfibia amfibia=new CAmfibia(ufo13, szybka, 120);
amfibia.Wypornosc=123;
amfibia.Zanuzenie=0,5;
pojazdy.Add(amfibia);
CSamochod samochod=new CSamochod(ferarri,120,ultradoładowanie);
samochod.RodzajNapedu=Naped.Elektryczny;
pojazdy.Add( samochod); 
thed napisał(a):

Przy dodawaniu raczej nie wykorzystam pomysłu polimorfizmu, dopiero wyświetlanie da mi taki efekt, ponieważ użyję Listy i dla każdego jej elementu tą samą metodę. Wtedy program sam zorientuje się, której metody z jakiej klasy użyć do wyświetlenia, prawda?
Dokładnie tak.

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0