具有派生接口成员的派生接口
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;
【讨论】:
以上是关于具有派生接口成员的派生接口的主要内容,如果未能解决你的问题,请参考以下文章