2010-03-10 7 views
18

Edit:Resulta que me olvidé de algo obvio, pero voy a dejar la pregunta abierta en caso de que alguien más cometa el mismo error obvio. Gracias a aquellos que lo señalaronVer abajo para una explicación.¿Agregar propiedades a una interfaz impide crear "conjuntos" privados/protegidos en tipos derivados?

¿Es posible tener un conjunto no público en una propiedad que está anulando una propiedad de interfaz?

Tal vez estoy teniendo un momento estúpido, pero me parece que tener una propiedad definida en una interfaz implica implícitamente que ninguna clase derivada puede proporcionar ningún conjunto no público para dicha propiedad.

Ejemplo:

interface IField 
{ 
    bool IsValid { get; } 
} 

... y ya que las propiedades de interfaz pueden no tener modificadores de accesibilidad significa que:

class Field : IField 
{ 
    public override bool IsValid { get; protected set; } 
} 

... no será posible a pesar del hecho de que cumple con la interfaz requisitos conceptualmente.

IMO esto tiene grandes implicaciones negativas para el encapsulamiento que pueden realizarse a través de Propiedades no públicas, y previene una serie de patrones de uso comunes para Propiedades.

Soy consciente de que puede crear un miembro SetIsValid no público que modifique un almacén de respaldo común, pero que crearía un patrón incoherente y agregaría lo que de otra manera sería ruido de código si no fuera necesario.

¿He perdido algo?


Editar: Sí tengo perdido algo

estoy modificar el código de otra persona en el momento y sólo se dan cuenta de que la clase estaba luchando con implementado la interfaz y derivado de una clase base Y soy nuevo en C# Eso es lo que causó la anulación de la confusión.

la clase real parecía:

class Field : IField, BaseField 
{ 
    public override bool IsValid { get; protected set; } 
} 

... donde BaseField implementa la interfaz también, pero no puso en práctica el conjunto.

+1

¿Intentó compilar su ejemplo primero? Su interfaz de ejemplo es incorrecta porque tiene el modificador público, que es ilegal. Además, la definición de su clase es incorrecta porque tiene la palabra clave de anulación en una definición de interfaz, que es ilegal.Una vez que corrijas esas dos cosas, se compilará perfectamente y funcionará como esperabas. – Nick

+0

El público en la interfaz era un error tipográfico. – Catskul

+1

Sí, estás teniendo uno de esos momentos. –

Respuesta

32

Esto es perfectamente legal. Usted no necesita la palabra clave override (de hecho no sería compilar) pero no hay nada que le para de esta manera:

interface IField 
{ 
    bool IsValid { get; } 
} 

class Field : IField 
{ 
    public bool IsValid { get; protected set; } 
} 
+0

Entonces, si tuviera que pasar un IField que hace referencia a un objeto Field y llamar a IsValid, se invocará Field.IsValid a pesar de la falta de "anulación"? – Catskul

+0

'override' se aplica a las clases base de las que hereda, no a las interfaces que implementa. – Gabe

+0

ah. Estoy modificando el código de otra persona en este momento y me doy cuenta de que la clase con la que estaba luchando implementó la interfaz * y * derivada de una clase base. Eso es lo que causó la anulación de la confusión. – Catskul

6

Es posible en las interfaces, pero no en abstracto/virtuales propiedades - puedes tener estos dos confundidos.

+0

¿No son todos los elementos de una interfaz virtuales por definición? (Soy algo nuevo en C#) – Catskul

+0

Me perdí el problema real. Ver publicación modificada. Gracias por la respuesta, me ayudó a ver lo que me había perdido. – Catskul

Cuestiones relacionadas