Diskuze: "MultiDědičnost" v Javě
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.
Udělej si třeba 2 rozhraní: IMatka, IOtec, v Imatka bude Uvarit(), v IOtec opravAuto, no a Syn ať "zdědí" z obou těchto rozhraní. Samozřejmě třída Matka bude implementovat IMatka, a Otec IOtec.
Podľa mňa je to zlý príklad dedičnosti. Najlepšie použitie dedičnosti
je vo vzťahu generalizácia - špecializácia, resp. je tam vzťah "JE". Syn
ale nie je špeciálny typ otca a ani neplatí, že syn JE otec (resp. nie
vždy). Príklad môže byť osoba - syn ... syn je špeciálnym prípadom osoby
a syn JE osoba.
Použitie dedičnosti iba aby sa zdedila nejaká funkcionalita je podľa mňa
zlé z pohľadu návrhu.
Matka, Otec a Syn jsou především <b>speciální případy</b> Osoby. Nějakým způsobem <b>rozšiřují</b> Osobu. Tento vztah mezi třídami se modeluje pomocí dědičnosti takže každá tato třída by měla dědit od Osoby:
public class Matka extends Osoba ...
Všechny tyto speciální případy mají dále nějakou <b>speciální funkcionalitu</b>, tento vztah se modeluje pomocí interface - chceš aby někdo uměl vařit a někdo opravovat auto, případně někdo aby uměl obojí. Takže potřebuješ interface pro Kuchaře a pro Opraváře. Funkcionalitu pak dodáš podle potřeby tomu komu chceš:
public class Matka extends Osoba implements Kuchař ...
public class Otec extends Osoba implements Opravář ...
public class Syn extends Osoba implements Kuchař, Opravář ...
Kuchař by mohl vypadat nějak takto:
public interface Kuchař {
public void uvař();
}
Opravář:
public interface Opravář {
public void oprav();
}
Dík za odpovědi, ale přes ten interface dochází přesně k onu případu, který jsem nechtěl - Matka i Otec musí mít obě metody. Je to pochopitelně jen cvičný příklad a kýženého výsledku by se dalo dojít normální cestou x možnostmi.
Mě šlo o to, když bych potřeboval ze dvou různých tříd, na sobě nezávislých, dědit a potřeboval bych od každé třeba 5 metod, ale pro jednoduchost jsem v příkladu uvedl jednu metodu od každého. Interface jsem přesně takhle použil, jak popisujete, ale (a to jsem zapoměl dodat, to se omlouvám) co když nemůžu zasahovat do "nadřazených" tříd a implementovat jim prázdné metody z rozhraní? (navíc potom by ani syn nevěděl, jestli dědit prázdnou metodu Otce nebo definovanou metodu Matky, muselo by se to zase konkretizovat.
Samozřejmě, že nejjednodušší cesta je udělat si dvě instance (Matky i Otce) ve třídě Syn a pak zavolat tyto metody a ano, není to geniální příklad dědičnosti. Je to vyjímečná situace a jde mi o ten princip.
Neměl bys chtít dědit ze dvou nezávislých tříd, to je logický nesmysl, pokud ty třídy spolu nemají nic společného, tak proč by měli mít nějakého společného potomka (odmyslíme-li si fakt, že to v Javě ani nejde). Pokud by ses snad do takové situace dostal, je to jasný indikátor, že je aplikace špatně navržená.
Dědičnost neslouží k tomu aby sis skládal třídy dohromady, tu pět funkcí z tohodle, tu deset funkcí z támhletoho... Dědičnost slouží k rozšíření funkcionality již existující třídy, která to umožňuje.
To co ty chceš je kompozice. Skládání několika funkcionalit dohromady pomocí interface, tak jak jsem to popsal výše.
přes ten interface dochází přesně k onu případu, který jsem nechtěl - Matka i Otec musí mít obě metody.
Tuhle poznámku jsem nepochopil, mohl bys to trochu rozvést? Jaké obě metody?
Já chápu, že rodinné vztahy Otec, Matka, Syn tak nějak svádějí k použití dědičnosti, ale je to v tomhle případě chyba, Syn není v tomto případě žádné rozšíření Otce a Matky, nic od nich nedědí, on akorát v sobě skládá část funkcionality Otce a část funkcionality Matky, takže se jedná o jasnou kompozici.
a ano, není to geniální příklad dědičnosti. Je to vyjímečná situace a jde mi o ten princip.
Ja som to myslel práve tak, že keď potrebuješ viacnásobnú dedičnosť tak niečo "smrdí" a je to lepšie nepoužiť. Je to znak toho, že dedíš iba preto lebo chceš zdediť a nahromadiť funkcionalitu z viacerých tried (tak to aj popisuješ), bez nejakého logického konceptu a to nie je dobrý typ dedičnosti.
Zobrazeno 7 zpráv z 7.