...V daném případě by bylo zjevně mnohem vhodnější, kdyby překladač použil Vaši metodu
v odvozené třídě a přetíženou metodu základní třídy skryl implicitně. A právě tak
se chová C# a VB.NET.
Překladač ale neprovádí žádné implicitní skrytí. Překladač provádí pouze implicitní typovou
konverzi parametru
i z
int
na
long
. Toto chování je
jeho nástrojem na řešení diskutované kolize. Takže jde o implicitní přetypování a nikoli skrytí.
...Ve skutečnosti dokonce ani žádné klíčové slovo new psát nemusíte, C# jej předpokládá implicitně.
Nepředpokládá. Dejte tam
new
explicitně a překladač hodí varování, že ho není třeba, neb
metoda nic neskrývá.
...pokud si výslovně nepožádáte o přetížení modifikátorem override , jen Vás upozorní varováním překladače.
Modifikátor
override
nepřetěžuje, nýbrž překrývá a s tímto příkladem vůbec nesouvisí.
...Vaši klienti stáhnou její upgrade a v tom okamžiku přestane Vaše knihovna fungovat, protože se obsahuje
metody přepisující neexistující rozhraní, nebo (pokud obsahuje Vaše vlastní metody se stejnou signaturou) -
začne je používat bez Vašeho vědomí, což je ještě horší.
Řešení tohoto a jiných problémů řeší .NET správou assemblies a jejich verzí. Není problém umožnit aplikaci
pracovat pouze s knihovnou pevně dané verze.
Jinak má podle mě s tou prasárnou Benjamín úplně pravdu - totiž, že by neměly existovat v jedné
větvi třídní hierarchie dvě metody, mezi nimiž je přerušená inheritance. Označení
prasárnaje výstižný, protože to vede to k nepřehlednosti.
Kolizí názvů se má předcházet výstižnými názvy. Pokud kolize nastane, autor odvozených tříd by měl použít
refaktoring. Až pokud z praktických důvodů nelze tyto metody použít, pak se holt musím smířit se snížením
přehlednosti (prasárnou). Každopádně by k tomu nemělo dojít, pokud celou třídní hierarchii spravuje jeden
vývojový tým. Pokud ovšem existuje celá řada na sebe navazujících knihoven od různých výrobců a tito
výrobci používají špatně pojmenovávací konvence, tak tomu asi s jistotou předejít nelze.