2009-11-04 13 views
6

tengo 2 interfaces base, IViewBase (que todas las vistas implementarán) y IPresenterBase (que todos los presentadores implementarán):interfaz derivada con el miembro de interfaz derivada

public interface IViewBase { } 

public interface IPresenterBase 
{ 
    IViewBase View { get; set; } 
} 

entonces he creado una nueva interfaz que ILogPresenter deriva de IPresenterBase y ILogView derivada de IViewBase:

public interface ILogPresenter : IPresenterBase { } 

public interface ILogView : IViewBase{ } 

cuando se crea una clase que implementa ILogPresenter,

public class LogPresenter: ILogPresenter 
{ 
    public ILogView View { get; set; } 
} 

Aparece un error:

'LogPresenter' no implementa el miembro de la interfaz 'IPresenterBase.View'. 'LogPresenter.View' no puede implementar 'IPresenterBase.View' porque no tiene el tipo de retorno coincidente de 'Views.IViewBase'.

No puedo establecer el tipo de devolución de LogPresenter.View a ILogView que deriva de IViewBase? Me gustaría implementar ILogPresenter con una IView diferente que se deriva de IViewBase.

Respuesta

9

es probable que desee utilizar los genéricos aquí:

public interface IViewBase { } 

public interface IPresenterBase<T> where T : IViewBase 
{ 
    T View { get; set; } 
} 

a continuación:

public interface ILogPresenter : IPresenterBase<ILogView> { } 

public interface ILogView : IViewBase{ } 

Aparte de los tipos de retorno covariantes no estar soportados en C# (lo que causaría un problema incluso sólo con un captador) tienes un problema fundamental en el original. Que podía hacer:

IPresenterBase foo = new LogPresenterImpl(); 
foo.View = new SomeOtherView(); 

donde SomeOtherView implementado IVewBase pero no ILogView. ¿Cómo esperas que tu propiedad haga frente a eso?

La versión genérica anterior resuelve esto al permitir que un presentador exprese qué tipo de vista está presentando.

2

Usted puede hacer esto con los genéricos:

public interface IViewBase { } 

public interface IPresenterBase<T> where T : IViewBase 
{ 
    T View { get; set; } 
} 

public interface ILogPresenter : IPresenterBase<ILogView> { } 

public interface ILogView : IViewBase { } 

public class LogPresenter : ILogPresenter 
{ 
    public ILogView View { get; set; } 
} 
Cuestiones relacionadas