6

我有 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。

4

2 回答 2

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

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

于 2009-11-04T10:30:33.653 回答
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; }
}
于 2009-11-04T10:31:54.897 回答