2009-10-26 21 views
7

Zrobiłem następujące oświadczenie dla interfejsów:Interfejsy z innym getter i setter dla tej samej propertie

public interface IBasic 
{ 
    int Data { get; } 
} 

public interface IChangeable : IBasic 
{ 
    int Data { set; } 
} 

Kompilator mówi, że IChangeable.Data ukrywa IBasic.Data. To rozsądne. Alternatywą Znalazłem to:

public interface IBasic 
{ 
    int Data { get; } 
} 

public interface IChangeable : IBasic 
{ 
    void ChangeData(int value); 
} 

Jest jakiś sposób, aby określić setter i pobierające dla tej samej nieruchomości w innej hierarchii na interfejsach? Czy są jakieś alternatywy dla tego podejścia?

+0

ma potrzeby deklarowania nieruchomości w IChangeable od wszystkich obiektów, które realizuje IChangeable również musi wdrożyć IBasic (ze względu na IChangeable: IBasic) – sisve

+0

@ Simon: Pokazałem uproszczenie problemu. W moim prawdziwym problemie The IBasic deklaruje więcej rzeczy. – FerranB

+0

@Simon - Na początku też popełniłem ten błąd. Chce, aby IChangeable dodał ustawcę. – tvanfosson

Odpowiedz

4

Możesz ponownie zadeklarować (lub raczej powiedzieć, że kompilator zamierzają to ukryć):

public interface IChangeable : IBasic 
{ 
    new int Data { set; } 
} 
class Foo : IChangeable 
{ 
    private int value; 
    int IBasic.Data { get { return value; } } 
    int IChangeable.Data { set {this.value = value;} } 
} 

Ale to jest mylące, a będziesz musiał użyć jawne implementacje itp, i prawdopodobnie trochę rzucania dzwoniącego, jeśli chcesz użyć ukrytej wersji. Jeśli poszedł tą drogą, polecam narażając zarówno get i set na IChangeable:

public interface IChangeable : IBasic 
{ 
    new int Data { get; set; } 
} 
class Foo : IChangeable 
{ 
    private int value; 
    int IBasic.Data { get { return value; } } 
    int IChangeable.Data { set { this.value = value; } get {return value; } } 
} 

Re komentarzach; narazić typu wykonawczego:

public interface IChangeable : IBasic 
{ 
    new int Data { set; } 
} 
public interface IBasic 
{ 
    int Data { get; } 
} 
class Foo : IChangeable 
{ 
    private int data; 
    public int Data { 
     get { return data; } 
     set { data = value; } 
    } 
} 

to będzie działać również jeśli się go (które wolę):

public interface IChangeable : IBasic 
{ 
    new int Data { get; set; } 
} 
+0

W tym podejściu, które jest sposobem przypisania wartości do Foo.Data? – FerranB

+0

'IChangeable c = {some foo}; c.Data = {pewna wartość}; 'Możesz również umieścić właściwość na publicznym interfejsie API, ale nie jest jasne, czy to jest' get', 'zestaw', oba itd. –

+0

chcę umożliwić implementatorowi 'IChangeable' mieć' get' i 'set'. – FerranB

1

Może ja źle pytanie, ale nie byłoby po prostu zrobić

public interface IChangeable : IBasic 
{ 
    int Data { get; set; } 
} 

tj. Niech IChangeable zastąpi właściwość, ale zachowaj "otrzymaj".

Jako, że IChangeable dziedziczy po IBasic, zakładam, że chcesz wdrożyć IChangeable do implementacji "get".

1

myślę GetData i metody setData jest bardziej oczywiste w tej sytuacji:

public interface IBasic 
{ 
    int GetData(); 
} 

public interface IChangeable : IBasic 
{ 
    void SetData(int data) 
} 
+0

Co z właściwością 'Data' tylko do odczytu z metodą" SetData "? –

+0

2 metody są dla mnie bardziej jasne w tym przypadku. – bniwredyc

Powiązane problemy