Anonymni funkce lze nahradit neanonymnimi? Ano, i v assembleru lze psát objektově. Bohužel
1) funkce se definuje jinde než se používá, tzn. kód je hůře čitelný
2) namespace se zaplácává zbytečnejma identifikátora a tím např. stěžuje orientaci v kódu pomocí automatizovanejch nástrojů, zapleveluje automaticky generovanou dokumentaci etc...
---
ad interfacy: Mám knihovnu, ve které je interface IA a IB poděděné z IA. Implementuju objekt A implementující IA a jeho potomka B implementujícího IB. Přestože objekt B má všechny metody interfacu IA, C++ kompilátor zařve, že mu schází všechny metody IA, poděděné skrze IB.
Proto pomocí vícenásobné dědičnosti v podání C++ neimplementují vše, co nabízejí jiné jazyky v podobě interfaců.
Řešit to lze pomocí virtuální dědičnosti, ale
1) knihovna, ve které mám ty interfacy nemusí být moje a tedy nemusím mít možnost ji upavovat
2) i pokud je knihovna moje, tak proč bych musel při návrhů interfaců přemýšlet o tom, jestli se někdy budou nebo nebuou účastnit diamantové dědičnosti? To je čistě záležitost implementace a proto do návrhu interfaců nepatří.
3) Řešit to celé tím, že všechny interfacy budou děděné virtuálně taktéž není řešením, neboť hlubší virtuální dědičnost má velké nároky na výkon.
prave ma pravou vicenasobnou dedicnost
Ano, C++ má pravou vícenásobnou dědičnost. Bohužel není v praxi příliš použitelná.
Jediné, co v C++ odpovídá vícenásobné dědičnosti tak, jak ji chápe OOP je vícenásobná virtuální dědičnost.A ta je natolik paměťově i časově náročná, že se používá minimálně.
Běžně užívaná prostá vvícenásobná dědičnost se již chová jinak, než by člověk čekal: je to něco mezi dědičností a kompozicí.
Navíc rozlišování mezi virtuální a nevirtuální dědičností vede k tomu, že musím u předka přemýšlet nad tím, jací a jak budou implementováni potomci (a jestli tedy musím dědit virtuálně či ne). Což je úplný opak toho, o co se snaží OOP - aby jednotlivé objekty byly implementovány samostatně.
a vsichni znaji jeji omezení
I v assembleru lze psát objektově a všichni znají jeho omezení. Přesto bych na objektové programování doporučil jiný jazyk.
Implementace vícenásobné dědičnosti v C++ má svoje plusy a svoje mínusy.Když píšu v C++, vadí mi absence interfaců (respektive její ne uplně dobrá emulace pomocí vícenásobné dědičnosti), když píšu v jiných jazycích, někdy mi vadí absence vícenásobné dědičnosti.
Přesto myslím, že jak mé zkušenosti, tak i obecná praxe a výsledek vývoje nových programovacích jazyků ukazuje, že interfacy jsou daleko užitečnější než vícenásobná dědičnost: zatímco snad všechny moderní jazyky mají interfacy, snad žádný neimplementuje vícenásobnou dědičnost. Přičemž vzhledem k tomu, že drtivá většina z nich je interpretovaná či alespoň runtime kompilovaná, nebyl by s přidáním vícenásobné dědičnosti žádný problém.