Bazová třída a dědění z interface rubrika: Programování: .Net

2 Jaroslav Urban
položil/-a 5.4.2013

Malý páteční kvíz:

Když máme dvě konkrétní třídy, které dědí z (abstract) bázové třídy a mají implementovat stejný interface, tak:

a) bázová třída dědí interface plus obsahuje společnou funkcionalitu
b) naše konkrétní třídy dědí interface a bázová třída obsahuje jen společnou funkcionality

Která je podle Vás lepší verze a proč?

Moje odpověď je 'b'

  • zbytečně zesložiťuje implementace děděné z bázové třídy > override, konstruktor parametry

Komentáře

  • Anonym : Interface se nedědí, nejde to. 5.4.2013
  • Anonym : To si piš, že interface se dědí. Dědičnost mezi rozhraními nejen že je možná, ale dokonce je i jediná logicky správná. 9.4.2013
  • Anonym : Četl jsi tu otázku? Můj komentář má kontext. Třídy nedědí z rozhraní. Ty ho prostě implementují, pokud má jazyk konstrukt pro explicitní vyjádření, nebo ho prostě mají implicitně. Některé jazyky mají něco jako interface inheritance, ale tam není co dědit, protože rozhraní nemají chování. Takže je lepší mluvit o skládání. 9.4.2013
  • Anonym : Jestli se chcete hádat o termity, tak rozhraní se nejen že nedědí, ale ani neimplementuje. Rozhraní se vystavuje! :-P A pak jsou zase lidi, kteří mluví o dědičnosti chování, dědičnosti stavu a dědičnosti rozhraní (nebo dědičnosti typu). A v tom si pak má člověk vybrat... 9.4.2013
  • Anonym : Není to tak, že množinu veřejných metod, kterým říkáme veřejné rozhraní třídy, tak tu třída vystavuje ? Zároveň může jiné rozhraní implementovat. 9.4.2013
  • Anonym : Tomu veřejnému rozhraní se taky říká typ. Ale to slovo má tolik různých významů... IMHO je to jedno. 10.4.2013
  • Augi : Tak tady se musím zastat rarouše. Rozhraní se opravdu nedědí, ale implementuje. Právě kvůli použití slovesa "dědí" jsem si musel tu otázku přečíst asi třikrát, než jsem ji pochopil... 12.4.2013
  • Anonym : interface muzou dedit az odvozene tridy od predka, ktery ho implementuje..:) 12.4.2013
  • Anonym : Zapomeňte na dědění, to je cesta do pekel. 12.4.2013
  • Honza Břešťan : Kompozice taky neni silver bullet. Pokud je potreba vystavit neco z toho memberu, koliduje to s Law of Demeter. Dedicnost je casto uzitecna, hlavne v samotnych prostredich/frameworcich. 12.4.2013
  • Anonym : No nevím, dědičnost koliduje s LoD mnohem více než kompozice. Zatím co, kompozice určuje striktní rozhraní, přes které mohou "strangers" komunikovat a mělo by být bezpečné, u třídy kterou otevřeme pro dědění otevíráme příliš mnoho detailů. A to je mnohem větší porušení LoD. 12.4.2013
  • Honza Břešťan : Kdyz nad tim tak premyslim, mate asi z obecneho hlediska pravdu. Treba v Objective-C nemam moc moznosti, jak rict, ze dana metoda proste nebude virtualni (nebo o tom nevim). I v jazycich, ktere nejsou padle na hlavu, je to pak z hlediska LoD na stejne urovni. Bazova trida muze urcit, co bude otevrene pro dedicnost, obecna trida proste urci, co je vubec viditelne. I ve zminenem pripade budou ekvivalentni - s tim rozdilem, ze je na miste svata valka o to, co vlastne znamena dedicnost (A is B) a kompozice (A has/uses B), ale to zalezi na konkretnim pripade a pro tuhle otazku to tu nevyresime :) 12.4.2013
  • Anonym : Tohle už je "docela hustej nářez". Zapomeňte na implementace ve vašich "programovacích jazycích". Tvrdit, že interface může zdědit pouze potomek třídy, která jej implementuje, to je platné pouze ve specifickém jazyce. Jazyk, který nedovoluje dědičnost mezi rozhraními může být jen těžko kompletní. Je to ideální nástroj na kontrolu míry abstrakce v daném úseku kódu. Ideální nástroj i pro vnitřní zabezpečení. Chápu, že se ke konstrukci "interface Y extends X" mockrát za život nedostanete, nicméně dává perfektní smysl. Zkuste si pogooglit. Rozhraní se mezi sebou opravdu neimplementují, i kdyby čert na koze jezdil. 18.4.2013
  • sljd06 : "u třídy kterou otevřeme pro dědění otevíráme příliš mnoho detailů" -> tam si snad taky definujeme libovolně striktní rozhraní obykle pomocí keywordu "protected", navíc třeba pomocí explicitní implementace rozhraní můžou objekt modifikovat "strangers", kteří nedědí, ale mají k dispozici typ rozhraní (tj. jsou uvnitř sestavení). V čem je kompozice lepší? 19.4.2013
  • Anonym : A co změna chování děděného objektu? Dědičnost je jednou z nejtěsnějších vazeb. Naproti tomu kompozice je vazbou volnou. http://www.zdrojak.cz/clanky/grasp-3-low-coupling/ 19.4.2013
  • sljd06 : "Změna chování děděného objektu" tj. nutnost reimplementace třídy, nebo změna stavu objektu za běhu? Dědičnost je těsná vazba, a jako taková musí dávat v dané implementaci smysl, jinak by se měl problém řešit jiným způsobem (rozhraní, události). Na jakém příkladě může být vidět ta přidaná hodnota kompozice? 19.4.2013
odkaz
Anonym
odpověděl/-a 9.4.2013
 
upravil/-a 9.4.2013

Obecné, ale přesné zadání -> nevidím v odpovědi problém. Zde poskytuji několik pravidel, které kriticky shlédněte, případně přidejte další :

Máme tedy abstraktní třídu A, rozhraní I a třídy C1,C2, které dědí od A.

  1. Pokud vyžadujete, aby právě a pouze všechny třídy, které dědí od A měly chování popsané v rozhraní I, pak smažte I a přesuňte ho do A.

  2. ({C1,C2} dědí od A ^ implementují I ) ^ (∃ C3: C3 nedědí od A ^ implementuje I) => A implementuje I, C3 implementuje I

  3. ({C1,C2} dědí od A ^ implementují I ) ^ (∃ C3: C3 dědí od A ^ neimplementuje I) => A neimplementuje I, {C1,C2} implementuje I

S rozhodnutím na základě pouček "co se má/nemá dělat" absolutně nesouhlasím. Exaktní řešení problémů takto nefungují. Nemůžete aplikovat pravidla z jiného systému na svůj vlastní a doufat, že míra korelace bude natolik velká, že "to bude pasovat". Místo zdlouhavého přemýšlení si rychle na první volný kus papíru po Vašem boku napište pravdivostní tabulku obsahující alespoň výše zmíněné body, rychle ji vyplňte v závislosti na vlastnostech VAŠEHO systému a řešení dostanete ihned a naprosto přesně.

Proto se učí predikátová logika. Každý to na střední škole dělal. Tohle je místo právě pro ní ! Využijte tohoto skvělého nástroje.

Komentáře

  • Honza Břešťan : Vlastne je to tak. Zkondenzovano na samotnou podstatu. 9.4.2013

Pro zobrazení všech 5 odpovědí se prosím přihlaste:

Rychlé přihlášení přes sociální sítě:

Nebo se přihlaste jménem a heslem:

Zadejte prosím svou e-mailovou adresu.
Zadejte své heslo.