2011-09-24 22 views
7

Próbowałem dziedziczyć interfejs i niektóre z automatycznie generowanych właściwości ustaw jako prywatne. To jest przykład.Dziedziczenie właściwości za pomocą modyfikatora dostępu w języku C#

public class MyClass 
{ 
    public interface A 
    { 
     int X {get; set;} 
    } 
    public interface B : A 
    { 
     int Y {get; set;} 
    } 

    public class C : A 
    { 
     public int X {get; private set;} 
    } 

Kiedy próbowałem to skompilować. Wystąpił błąd 'MyClass.C' does not implement interface member 'MyClass.A.X.set'. 'MyClass.C.X.set' is not public..

Próbowałem z private set; w iterface A, ale mam ten błąd ponownie: 'MyClass.A.X.set': accessibility modifiers may not be used on accessors in an interface.

Czy ten modyfikator dostępu jest niedozwolony w języku C#?

Odpowiedz

21

Próbowałem z prywatnym zestawem; w iterface A, ale mam ten błąd ponownie

Jeśli interfejs wymaga tylko, że nieruchomość powinna być dostępne, można zdefiniować jako:

public interface A 
{ 
    int X {get;} // Leave off set entirely 
} 
1

Deklaracja interfejsu definiuje publiczny zbiór członków, które musi posiadać typ implementacji. Tak więc, jeśli C implementuje A, musi mieć publiczny element członkowski dla każdego elementu zdefiniowanego przez interfejs.

A definiuje, że każdy typ implementacji musi mieć publiczną własność X z publicznym użytkownikiem i publicznym ustawiaczem. C nie spełnia tego wymagania.

+0

Członek publiczny nie jest jedyną opcją. Jawna implementacja interfejsu jest druga. – svick

0

Można myśleć o interfejsie jako minimalną funkcjonalność którą twoja klasa musi wdrożyć. Jeśli interfejs określa, że ​​właściwość udostępnia klauzulę get i set, należy wdrożyć publiczną klauzulę get i set w klasie, ponieważ tylko publiczne metody i właściwości mogą domyślnie implementować interfejsy.

Możesz po prostu pominąć słowo kluczowe set w definicji właściwości interfejsu, jeśli nie chcesz ujawniać publicznego mutatora. Następnie możesz uczynić mutator implementacji publicznym lub prywatnym.

0

Nie jest to zabronione. Pamiętaj, że kod, który używa wystąpienie class Cmusi móc traktować go jako interface A, co oznacza, że ​​umowa jest getter i setter publicznych dla własności X.

Odnosi się to do dziedziczenia klas, jak również interfejs dziedziczenie - musisz przestrzegać umowy typu, z którego jesteś wywodzona.

Jeśli intencją kodu jest, że własność X nie powinien mieć publiczny setter, a następnie interfejs powinien być określony tylko z { get; }

0

wierzę członków interfejsu musi być publiczne, jeśli sam interfejs jest publiczna. Twoja implementacja nieruchomości jest z tego powodu wadliwa.

+1

Członkowie, którzy niejawnie implementują członków interfejsu, muszą być publicznie * niezależnie * od domeny dostępności samego interfejsu. –

Powiązane problemy