2011-09-24 11 views
7

Intenté heredar la interfaz y convertir parte de la propiedad del conjunto generado automáticamente en privada. Esto es un ejemplo.Heredar propiedades con el modificador de accesibilidad en 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;} 
    } 

Cuando traté de compilarlo. Obtuve un error 'MyClass.C' does not implement interface member 'MyClass.A.X.set'. 'MyClass.C.X.set' is not public..

Lo intenté con private set; en , pero recibí este error de nuevo: 'MyClass.A.X.set': accessibility modifiers may not be used on accessors in an interface.

¿Este modificador de accesibilidad no está permitido en C#?

Respuesta

21

He intentado con el sistema privado; en iterface A, pero me dio este error de nuevo

Si su interfaz sólo requiere que una propiedad debe ser recuperable, que lo definen como:

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

La declaración de una interfaz define el conjunto público de miembros que debe tener el tipo de implementación. Por lo tanto, si C implementa A, debe tener un miembro público para cada miembro definido por la interfaz.

A define que cualquier tipo de implementación debe tener una propiedad pública X con un getter público y un setter público. C no cumple este requisito.

+0

Miembro público no es la única opción. La implementación explícita de la interfaz es la otra. – svick

0

Se puede pensar en una interfaz como la funcionalidad mínima que tu clase debe implementar Si la interfaz especifica que una propiedad expone una cláusula get y set, debe implementar una cláusula pública get y set en su clase, ya que solo los métodos y las propiedades públicas pueden implementar implícitamente las interfaces.

Simplemente puede omitir la palabra clave set en la definición de propiedad de la interfaz si no desea exponer un mutador público. Luego puede hacer que la implementación del mutador sea pública o privada.

0

No, no está permitido. Recuerde, el código que está utilizando una instancia de class C debe ser capaz de tratarlo como un interface A, lo que significa que el contrato es un captador pública y setter para la propiedad X.

Esto se aplica a la herencia de clases, así como la interfaz herencia: debe cumplir el contrato del tipo del que se deriva.

Si la intención del código es que la propiedad X no debe tener un regulador público, entonces la interfaz debería definirse con sólo el { get; }

0

creo que los miembros de conexión deben ser públicas si la propia interfaz es público. Su implementación de la propiedad es defectuosa debido a eso.

+1

Los miembros que implementen implícitamente miembros de la interfaz deben ser públicos * independientemente * del dominio de accesibilidad de la interfaz. –