2011-09-24 21 views
7

Ho provato ad ereditare l'interfaccia e a rendere privata la proprietà dell'insieme generato automaticamente. Questo è un esempio.Ereditarietà delle proprietà con modificatore dell'accessibilità in 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;} 
    } 

Quando ho provato a compilarlo. Ho ricevuto un errore 'MyClass.C' does not implement interface member 'MyClass.A.X.set'. 'MyClass.C.X.set' is not public..

Ho provato con private set; in iterface A, ma ho ancora questo errore: 'MyClass.A.X.set': accessibility modifiers may not be used on accessors in an interface.

Questo modificatore di accessibilità non è consentito in C#?

risposta

21

Ho provato con il set privato; in iterface A, ma ho ottenuto questo errore di nuovo

Se l'interfaccia richiede solo che una proprietà deve essere recuperabile, si definisce come:

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

La dichiarazione di un'interfaccia definisce l'insieme pubblico di membri che il tipo di implementazione deve avere. Quindi, se C implementa A, deve avere un membro pubblico per ciascun membro definito dall'interfaccia.

A definisce che qualsiasi tipo di implementazione deve avere una proprietà pubblica X con un getter pubblico e un setter pubblico. C non soddisfa questo requisito.

+0

Il membro pubblico non è l'unica opzione. L'implementazione dell'interfaccia esplicita è l'altra. – svick

0

Si può pensare a un'interfaccia come la funzionalità minima che la tua classe deve implementare. Se l'interfaccia specifica che una proprietà espone una clausola get e una clausola set, è necessario implementare una clausola pubblica get e set nella classe, in quanto solo metodi e proprietà pubbliche possono implementare implicitamente interfacce.

È possibile tralasciare semplicemente la parola chiave set nella definizione della proprietà dell'interfaccia se non si desidera esporre un mutatore pubblico. Quindi puoi rendere il mutatore dell'implementazione pubblico o privato.

0

No, non è consentito. Ricordate, il codice che utilizza un'istanza di class Cdeve essere in grado di trattarlo come un interface A, il che significa che il contratto è un getter e setter pubblico per i beni X.

Questo vale per ereditarietà di classe così come l'interfaccia eredità - devi seguire il contratto del tipo da cui sei derivato.

Se l'intento del codice è che la proprietà X non dovrebbe avere un setter pubblico, quindi l'interfaccia dovrebbe essere definito con il solo { get; }

0

Credo membri interfaccia deve essere pubblico, se l'interfaccia stessa è pubblico. La tua implementazione della proprietà è errata a causa di ciò.

+1

I membri che implementano implicitamente i membri dell'interfaccia devono essere pubblici * indipendentemente * dal dominio di accessibilità dell'interfaccia stessa. –

Problemi correlati