2009-11-04 15 views
6

I 2 Basis-Interfaces haben, IViewBase (die alle Ansichten werden implementieren) und IPresenterBase (die alle Moderatoren umsetzen):Abgeleitet Schnittstelle mit abgeleiteten Schnittstelle Mitglied

public interface IViewBase { } 

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

Dann eine neue Schnittstelle ILogPresenter i erstellt haben, die leitet sich von IPresenterBase und ILogView von IViewBase ableiten:

public interface ILogPresenter : IPresenterBase { } 

public interface ILogView : IViewBase{ } 

Wenn ich eine Klasse erstellen, die ILogPresenter implementiert,

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

Ich erhalte eine Fehlermeldung:

'LogPresenter' implementiert kein Interface-Mitglied 'IPresenterBase.View'. 'LogPresenter.View' kann 'IPresenterBase.View' nicht implementieren, da es nicht den passenden Rückgabetyp von 'Views.IViewBase' hat.

Ich kann den Rückgabetyp von LogPresenter.View nicht auf ILogView setzen, die von IViewBase abgeleitet ist? Ich möchte ILogPresenter mit einer anderen IView implementieren, die von IViewBase abgeleitet ist.

Antwort

9

Sie wollen wahrscheinlich Generika verwenden hier:

public interface IViewBase { } 

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

dann:

public interface ILogPresenter : IPresenterBase<ILogView> { } 

public interface ILogView : IViewBase{ } 

Abgesehen von kovarianten Rückgabetypen nicht in C# unterstützt wird (was ein Problem auch nur mit einem Getter verursachen würde) Sie haben ein grundlegendes Problem im Original. Ich konnte tun:

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

wo SomeOtherView implementiert IVewBase aber nicht ILogView. Wie würden Sie davon ausgehen, dass Ihre Immobilie damit zurechtkommt?

Die obige generische Version löst dies, indem es einem Moderator ermöglicht, auszudrücken, welche Art von Sicht es darstellt.

2

Sie können dies mit Generika:

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; } 
}