2012-12-25 14 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' nie realizuje element interfejsu 'InterfaceTest.IAlpha.BetaProperty'. "InterfaceTest.Alpha.BetaProperty" nie może zaimplementować interfejsu "InterfaceTest.IAlpha.BetaProperty", ponieważ nie ma zgodnego typu powrotu "InterfaceTest.IBeta".C realizacja nieruchomość # interfejs

Moje pytanie brzmi, dlaczego implementacja własności jest ograniczona do tego samego typu. Dlaczego nie mogę zamiast tego użyć typu pochodnego?

+2

Twoja klasa, która dziedziczy interfejs, zwraca Beta insteed z IBeta zadeklarowanego w interfejsie. –

Odpowiedz

10

Musisz wdrożyć dokładnie ten sam interfejs . Na przykład ten powinny ważne:

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

... ale to nie będzie działać z kodem, który zawsze spodziewa się Beta, prawda?

Można użyć rodzajowych w tym jednak:

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

... 

public class Alpha : IAlpha<Beta> 

Oczywiście, że może być przesadą - może być lepiej po prostu za pomocą właściwości typu IBeta w Alpha, dokładnie jak na interfejsie. To zależy od kontekstu.

+0

Wielkie dzięki za wyjaśnienie i alternatywne rozwiązanie. :) – karaxuna

+0

@ Keet Jona. Dlaczego nadal nie jest możliwe, jeśli interfejs 'IAlpha' definiuje tylko getter w BetaProperty? Każda implementacja interfejsu będzie zawsze gwarantowała zwrócenie IBeta. – user2697817

+0

@ user2697817: To po prostu sposób. NET i C# są zdefiniowane. Możesz użyć jawnej implementacji interfejsu, aby zaimplementować 'IAlpha', a następnie udostępnić bardziej specyficzny getter właściwości o tej samej nazwie. –

2

Interfejs deklaruje zestaw metod, jakie klasa będzie miała, więc każdy, kto go używa, wie, czego się spodziewać.

Tak więc, jeśli implementujesz ten interfejs, musisz wdrożyć interfejs dokładnie, aby wszyscy pozostali użytkownicy otrzymali to, czego oczekiwali.