派生接口与派生接口成员

时间:2009-11-04 10:22:04

标签: c# interface view presenter

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

public interface IViewBase { }

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

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

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?我想用不同的IView实现ILogPresenter,它来自IViewBase。

2 个答案:

答案 0 :(得分:9)

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

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。您希望您的房产如何应对?

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

答案 1 :(得分: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; }
}