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.
Zobrazeno 7 zpráv z 7.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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.
