Bij werken met generics mag je de regels zoals je die kent met overerving
niet toepassen. Dus T Clone() is een andere methode dan object Clone(), maar hebben behalve de naam en het aantal parameters niets gemeen.
Microsoft gebruikt dit principe ook voor sommige interfaces, zoals ICollection. Daarbij zijn er ook methodes met dezelfde naam maar een verschillend signatuur. Wat ze dan doen, vertaald naar jouw probleem, is:
Code: Selecteer alles
public interface ICloneable<T>
{
T Clone();
}
public class MyClass : ICloneable<MyClass>, ICloneable
{
public MyClass Clone()
{
// ...
}
public object ICloneable.Clone()
{
return Clone();
}
}
(Code is niet getest.)
Dus één klasse implementeert beide interfaces, maar de eis dat je ICloneable moet implementeren als je ICloneable<T> implementeert, is weggelaten (net als dat het .Net library geen "
ICollection<T> :
ICollection" interface definieert). Om toch voor beide interfaces een implementatie te geven (dat is tenslotte verplicht als je erft van beide) gebruik je voor de 'oude' methode(s) de naam van de interface ervoor. Dit principe zorgt ervoor dat je in IntelliSense alleen jouw generic Clone methode ziet, maar je het object kan casten naar een ICloneable (niet generic) en Clone dan ook werkt (maar dan de niet generic versie die een object terug geeft).