gpt4 book ai didi

c# - 具有派生接口(interface)成员的派生接口(interface)

转载 作者:太空狗 更新时间:2023-10-29 21:11:22 24 4
gpt4 key购买 nike

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

public interface IViewBase { }

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

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

public interface ILogPresenter : IPresenterBase { }

public interface ILogView : IViewBase{ }

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

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

我得到一个错误:

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

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

最佳答案

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

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。您希望您的属性(property)如何应对这种情况?

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

关于c# - 具有派生接口(interface)成员的派生接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1672882/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com