Tengo un conjunto de interfaces que se utilizan en estrecha relación con un objeto mutable particular.C#: interfaz getter/setters de herencia
Muchos usuarios del objeto solo necesitan la capacidad de leer valores del objeto, y solo unas pocas propiedades. Para evitar la contaminación del espacio de nombres (intellisense más fácil) y para conocer el propósito del uso, me gustaría tener una pequeña interfaz base que solo exhiba unas pocas propiedades de "clave" en forma de solo lectura.
Sin embargo, casi todas las implementaciones admitirán la interfaz completa, que incluye modificabilidad.
Por desgracia, me encontré con un control de carretera que expresa ese concepto en C#:
interface IBasicProps {
public int Priority { get; }
public string Name {get;}
//... whatever
}
interface IBasicPropsWriteable:IBasicProps {
public int Priority { set; } //warning CS0108: [...] hides inherited member [...]
public string Name { set; }
//... whatever
}
Desde luego, no tenía la intención de ocultar los miembros, de manera que el aint bueno!
Por supuesto, puedo resolver esto usando métodos bien, pero ¿cuál es la opción correcta? Me gustaría mantener la interfaz "central" lo más pequeña posible, incluso si la división de las interfaces no tiene otro propósito que comunicar la intención. Con las interfaces divididas, es realmente obvio qué métodos no van a hacer ninguna actualización, y hace que la escritura del código sea un poco más clara (sin mencionar también permite simples y únicos stubs únicos estáticos que son suficientes para bastantes casos simples) .
Me gustaría evitar cualquier clase abstracta y similares; hacen que la reimplementación o calzas de un solo propósito sean más complejas y difíciles de asimilar.
Entonces, ¿ideas?
Como beneficio adicional, esto también funciona bien con co/contravariancia; Mi caso de uso real es más parecido a 'IBasicProps {/*...*/} IBasicPropsWriteable : IBasicProps {}'. Aquí la división de la interfaz es necesaria; un administrador central desea que la covarianza coloque varios objetos en una colección, pero los propietarios individuales de cada objeto saben qué tipo contiene. –
¿Qué opina sobre omitir el getter en la nueva propiedad en la interfaz derivada, como se sugiere aquí? http: // stackoverflow.com/questions/3516279/interface-inheritance-is-extend-properties-possible # comment3676924_3516450 –
Si bien esta es probablemente la solución menos mala posible en C#, sigue siendo insatisfactorio usar el modificador 'new' porque significa que" hay un propiedad sin relación del mismo nombre, la propiedad antigua todavía está sobreviviendo pero necesita una sintaxis más compleja para acceder a través de 'IBasicPropsWriteable'". Sería bueno si pudiera extender la "misma" propiedad con un accesorio adicional. (El mismo problema existe cuando las clases se heredan entre sí). Con su solución, el código 'static void M (IBasicPropsWriteable x) {var a = x.Name; var b = ((IBasicProps) x) .Name; } '¡lee formalmente dos miembros diferentes! –