Si el hecho de que la única manera de hacer esto es mediante el uso de la palabra clave new
te molesta, entonces en mi opinión que usted está pensando acerca de las interfaces equivocadas.
Claro, usted podría decir que IInherited
"hereda de" IBase
; pero ¿qué significa eso realmente ? Estas son interfaces; ellos establecen contratos de código. Al ocultar la propiedad IBase.Property1
con new string Property1 { get; set; }
, no está ocultando ninguna funcionalidad. Por lo tanto, la razón tradicional por la que muchos desarrolladores consideran que esconderse es algo "malo", que viola el polimorfismo, es irrelevante en este caso.
Pregúntese: lo que realmente importa cuando se trata de interfaces? Proporcionan una garantía de responder a ciertas llamadas a métodos, ¿verdad?
Por lo tanto, teniendo en cuenta las dos interfaces siguientes:
interface IBase
{
string Property1 { get; }
}
interface IInherited : IBase
{
new string Property1 { set; }
}
- Si un objeto implementa
IBase
, se puede leer su propiedad Property1
.
- Si un objeto implementa
IInherited
, puede leer su propiedad Property1
(al igual que con una implementación IBase
), y también puede escribir en él.
Una vez más, aquí no hay nada realmente problemático.
Creo que aquí hay confusión entre la herencia de las clases y la herencia de las interfaces. Una interfaz realmente no hereda a otra en el mismo caso en que una clase hereda a otra. Todo lo que dice su código es que IInherited también implementa IBase. El código está bien, solo genera una advertencia de compilación porque está cambiando la firma de Property1 en la interfaz. Puedes borrar esto con nuevo. –
Como lo señalaron muchos otros, esta sintaxis no es posible, pero creo que debería ser así. Si usa Reflection en Property1, habría un método Property1_get y un método Property1_set, por lo que, lógicamente, parece que debería poder implementarlos por separado. Y la falta de poder hacerlo definitivamente hace que duplique código a veces (o aguante la nueva palabra clave). – cedd