2009-10-26 16 views
7

he hecho la siguiente declaración de interfaces:Interfaces con diferentes get y set para el mismo propertie

public interface IBasic 
{ 
    int Data { get; } 
} 

public interface IChangeable : IBasic 
{ 
    int Data { set; } 
} 

El compilador dice que esconde IChangeable.DataIBasic.Data. Es razonable. La alternativa que he encontrado es:

public interface IBasic 
{ 
    int Data { get; } 
} 

public interface IChangeable : IBasic 
{ 
    void ChangeData(int value); 
} 

¿Hay alguna manera de definir setter y getters para la misma propiedad en diferentes jerarquías en las interfaces? O hay alternativas a este enfoque?

+0

No hay necesidad de declarar la propiedad en IChangeable ya que todos los objetos que implementa IChangeable también debe implementar IBasic (debido a IChangeable: IBasic) – sisve

+0

@ Simon: He demostrado una simplificación del problema. En mi problema real, The IBasic declara más cosas. – FerranB

+0

@Simon: también cometí este error al principio. Él quiere que IChangeable agregue un settor. – tvanfosson

Respuesta

4

puede volver a declarar que (o más bien, decirle al compilador que intención de ocultarlo):

public interface IChangeable : IBasic 
{ 
    new int Data { set; } 
} 
class Foo : IChangeable 
{ 
    private int value; 
    int IBasic.Data { get { return value; } } 
    int IChangeable.Data { set {this.value = value;} } 
} 

Pero esto es confuso, por lo que deberá utilizar implementaciones explícitas etc, y probablemente un poco de casting en la persona que llama si quiere usar la versión oculta. Si usted fue esta ruta, recomendaría exponer tanto la get y set en IChangeable:

public interface IChangeable : IBasic 
{ 
    new int Data { get; set; } 
} 
class Foo : IChangeable 
{ 
    private int value; 
    int IBasic.Data { get { return value; } } 
    int IChangeable.Data { set { this.value = value; } get {return value; } } 
} 

Re los comentarios; para exponer el tipo de aplicación:

public interface IChangeable : IBasic 
{ 
    new int Data { set; } 
} 
public interface IBasic 
{ 
    int Data { get; } 
} 
class Foo : IChangeable 
{ 
    private int data; 
    public int Data { 
     get { return data; } 
     set { data = value; } 
    } 
} 

Esto también funcionaría si lo hace (que yo prefiero):

public interface IChangeable : IBasic 
{ 
    new int Data { get; set; } 
} 
+0

En este enfoque, ¿cuál es la forma de asignar valor a Foo.Data? – FerranB

+0

'IChangeable c = {some foo}; c.Data = {algún valor}; 'También podría poner la propiedad en la API pública, pero no está claro a partir de la pregunta si ese sería el' get', el 'set', ambos, etc. –

+0

I querer permitir que el implementador de 'IChangeable' tenga' get' y 'set'. – FerranB

1

Quizás he entendido mal su pregunta, pero no os acaba de hacer

public interface IChangeable : IBasic 
{ 
    int Data { get; set; } 
} 

ie Deje IChangeable anular la propiedad, pero mantener el "obtener" presente.

Como IChangeable hereda de IBasic supongo que quiere una implementación de IChangeable para tener una implementación de "obtener".

1

creo GetData y métodos SetData es más claro de esta situación:

public interface IBasic 
{ 
    int GetData(); 
} 

public interface IChangeable : IBasic 
{ 
    void SetData(int data) 
} 
+0

¿Qué tal una propiedad de 'Datos' solo de lectura con un método' SetData'? –

+0

2 métodos es más claro para mí en este caso. – bniwredyc

Cuestiones relacionadas