具有派生接口成员的派生接口

Posted

技术标签:

【中文标题】具有派生接口成员的派生接口【英文标题】:Derived Interface with derived interface member 【发布时间】:2010-12-12 23:21:46 【问题描述】:

我有 2 个基本接口,IViewBase(所有视图都将实现)和 IPresenterBase(所有演示者都将实现):

public interface IViewBase  

public interface IPresenterBase

    IViewBase View  get; set; 

然后我创建了一个派生自 IPresenterBase 的新接口 ILogPresenter 和派生自 IViewBase 的 ILogView:

public interface ILogPresenter : IPresenterBase  

public interface ILogView : IViewBase 

当我创建一个实现 ILogPresenter 的类时,

public class LogPresenter: ILogPresenter

    public ILogView View  get; set; 

我收到一个错误:

“LogPresenter”没有实现接口成员“IPresenterBase.View”。 “LogPresenter.View”无法实现“IPresenterBase.View”,因为它没有匹配的返回类型“Views.IViewBase”。

我无法将 LogPresenter.View 的返回类型设置为从 IViewBase 派生的 ILogView?我想使用派生自 IViewBase 的不同 IView 来实现 ILogPresenter。

【问题讨论】:

【参考方案1】:

您可能想在这里使用泛型:

public interface IViewBase  

public interface IPresenterBase<T> where T : IViewBase

    T View  get; set; 

然后:

public interface ILogPresenter : IPresenterBase<ILogView>  

public interface ILogView : IViewBase 

除了 C# 中不支持协变返回类型(即使只是使用 getter 也会导致问题),您在原始版本中还有一个基本问题。我可以这样做:

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

其中SomeOtherView 实现了IVewBase,但没有实现ILogView。您希望您的财产如何应对这种情况?

上面的通用版本通过允许演示者表达它所呈现的视图来解决这个问题。

【讨论】:

【参考方案2】:

你可以用泛型做到这一点:

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; 

【讨论】:

以上是关于具有派生接口成员的派生接口的主要内容,如果未能解决你的问题,请参考以下文章

C++多继承

C#接口

C# 接口(Interface)

接口和抽象类

C#图解教程 第十五章 接口

如何初始化派生类中的静态成员?