Ik ben een applicatie aan het maken en nou kwam ik het volgende tegen met betrekking tot interfaces.
Ik heb een interface IModuleInstance en die heeft een Property Module van het type IModule
nou ben ik een implementatie van IModuleInstance aan het maken ModuleInstance en die heeft natuurlijk ook de Property Module. Alleen weet ik natuurlijk welke implementatie van IModule ik daar terug geef ( Module ). Nou vindt de compiler dat ik dat type daar niet aan mag geven omdat mijn signature dan niet overeenkomt. Op zich is dat wel logisch. Maar waarom is het eigenlijk zo dat ik daar niet een specifieker type aan mag geven. Op die manier voldoe ik toch eigenlijk nog gewoon aan de interface.
Op zich is het makkelijk op te lossen door gewoon als return type IModule te hebben of eventueel een expliciet de interface IModuleInterface te implementeren. Ik vroeg me echter af waarom dit niet gewoon goed gerekend wordt.
Bij delegates is het tenslotte ook mogenlijk op de volgende manier
Het haalt voor MyMethod natuurlijk niet uit dat hij een specifieker type van EventArgs krijgt. Zo lijkt het mij ook in mijn voorgaande voorbeeld dat een eventuele gebruiker van IModuleInterface niet interesant dat er een specifieker type van IModule terug wordt gegeven.
Mijn vraag is dus: Waarom is er voor gekozen om dit te verbieden?
Ik heb een interface IModuleInstance en die heeft een Property Module van het type IModule
nou ben ik een implementatie van IModuleInstance aan het maken ModuleInstance en die heeft natuurlijk ook de Property Module. Alleen weet ik natuurlijk welke implementatie van IModule ik daar terug geef ( Module ). Nou vindt de compiler dat ik dat type daar niet aan mag geven omdat mijn signature dan niet overeenkomt. Op zich is dat wel logisch. Maar waarom is het eigenlijk zo dat ik daar niet een specifieker type aan mag geven. Op die manier voldoe ik toch eigenlijk nog gewoon aan de interface.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| interface IModuleInterface { IModule Module{ get; } } interface IModule{} class Module : IModule {} class ModuleInterface : IModuleInterface { Module Module //Dit mag dus niet { get{ return module; } } } |
Op zich is het makkelijk op te lossen door gewoon als return type IModule te hebben of eventueel een expliciet de interface IModuleInterface te implementeren. Ik vroeg me echter af waarom dit niet gewoon goed gerekend wordt.
Bij delegates is het tenslotte ook mogenlijk op de volgende manier
C#:
1
2
3
4
5
6
7
8
| delegate void MyEventHandler( object sender, MySpecificEventArgs e ); event MyEventHandler MyEvent; public void MyMethod( object sender, EventArgs e ) { } MyEvent += MyMethod; |
Het haalt voor MyMethod natuurlijk niet uit dat hij een specifieker type van EventArgs krijgt. Zo lijkt het mij ook in mijn voorgaande voorbeeld dat een eventuele gebruiker van IModuleInterface niet interesant dat er een specifieker type van IModule terug wordt gegeven.
Mijn vraag is dus: Waarom is er voor gekozen om dit te verbieden?
“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”