2012-12-25 15 views
5
interface IAlpha 
{ 
    IBeta BetaProperty { get; set; } 
} 

interface IBeta 
{ 

} 

class Alpha : IAlpha 
{ 
    public Beta BetaProperty { get; set; } // error here 
} 

class Beta : IBeta 
{ 

} 

'InterfaceTest.Alpha' non implementa il membro di interfaccia 'InterfaceTest.IAlpha.BetaProperty'. 'InterfaceTest.Alpha.BetaProperty' non può implementare 'InterfaceTest.IAlpha.BetaProperty' perché non ha il tipo di restituzione corrispondente di 'InterfaceTest.IBeta'.C implementazione proprietà # interfaccia

La mia domanda è perché un'implementazione di proprietà è limitata allo stesso tipo. Perché non posso usare il tipo derivato, invece?

+2

La classe che eredita l'interfaccia restituisce una Beta di un IBte dichiarato nell'interfaccia. –

risposta

10

È necessario implementare l'interfaccia esatta. Ad esempio, questo dovrebbe essere valida:

IAlpha alpha = new Alpha(); 
alpha.BetaProperty = new SomeOtherIBetaImplementation(); 

... ma che non avrebbe funzionato con il codice che sempre si aspetta che sia un Beta, vero?

È possibile utilizzare farmaci generici per questo però:

interface IAlpha<TBeta> where TBeta : IBeta 
{ 
    TBeta BetaProperty { get; set; } 
} 

... 

public class Alpha : IAlpha<Beta> 

Naturalmente, che potrebbe essere eccessivo - potrebbe essere meglio solo utilizzando una proprietà di tipo IBeta in Alpha, esattamente come per l'interfaccia. Dipende dal contesto.

+0

Grazie mille per la spiegazione e per la soluzione alternativa. :) – karaxuna

+0

@ Jon Keet. Perché non è ancora possibile se l'interfaccia 'IAlpha' definisce solo un getter su BetaProperty? Qualsiasi implementazione dell'interfaccia sarebbe sempre garantita per restituire un IBeta. – user2697817

+0

@ user2697817: È proprio il modo in cui vengono definiti .NET e C#. È possibile utilizzare l'implementazione esplicita dell'interfaccia per implementare 'IAlpha' e quindi esporre un getter di proprietà più specifico con lo stesso nome. –

2

Un'interfaccia dichiara un insieme di metodi che la classe avrà, quindi chiunque usi quell'interfaccia sa cosa aspettarsi.

Quindi, se stai implementando tale interfaccia, devi implementare l'interfaccia esatta, in modo che tutti gli altri utenti ottengano ciò che si aspettavano.

Problemi correlati