Takže pokud budu dělat zbraň na skřety, tak tam musím znovu zopakovat celou metodu jak se útočí a někam dovnitř tam vepsat modifikátor x2? Nebo jak.
A když takových zbraní vyrobím třicet, tak tam budu mít třicet skoroduplicitních kódů? A když pak budu chtít změnit algoritmus útoků všech zbraní.... No fuj.... To už snad radši ten neOOP přístup. :-)
Anebo z jiné strany - mám zbraň na skřety. Mám zbraň na draky. Jak z toho jednoduše vyrobím zbraň, která kombinuje vlastnosti obou?
Ono samozřejmě že OOP přístup je lepší (spíš bych řekl že je nejbližší realitě a proto přináší nejméně problémů), ale zrovna přístup chci modifikaci objektu, tak ho podědím je imho
velmi špatný.
Copak zbraň více zraňující skřety je něco "speciálnějšího" než zbraň? Copak ona umí něco více, poskytuje něco co běžná zbraň ne? Tak proč dědičnost? Zraňovat více skřety je vlastnost zbraně a jako taková by měla být implementována: tedy nikoli dědičností, ale agregací dané vlastnosti.
B je potomkem A který má navíc i draky tak budu reagovat na instanci B.
Fuj. To je právě to. A proč je zbraň která je na skřety i draky potomkem zbraně, která je jen na skřety a ne potomkem zbraně, která je jen na draky? Nebo potomkem obou? (což jaksi v javě/C# nejde a v C++ je zdrojem velkých problémů...
Můžu ale udělat i tu nestvůru. Změním její metodu příjmu zranění.
To můžu, ale dostanu se do stejnejch problémů u nestvůry, která bude skřet i drak (skřetodrak, no fuj :-) ).
Pokud chci zavést nový typ všeobecněji - bude třeba změnit rozhraní a udělat refaktorizaci. Včetně databáze. ..... U ostatních, co si někdo splácal na koleně to vyhodí chybu implementace rozhraní - nebudou mít metody které jsem přidal.
Bavíme se o OOP? Já měl za to, že v OOP implementace potomka NESMÍ zasahovat do implementace předka. Pokud pro novej typ musím modifikovat předka, něco jsem udělal špatně...
Právě proto, aby fungovali i objekty, co napíše někdo jiný...