加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 派生接口成员的派生接口

发布时间:2020-12-15 04:17:30 所属栏目:百科 来源:网络整理
导读:我有2个基本接口,IViewBase(所有视图都将实现)和IPresenterBase(所有演示者都将实现): public interface IViewBase { }public interface IPresenterBase{ IViewBase View { get; set; }} 然后我创建了一个新的接口ILogPresenter,它派生自IPresenterBase和IL
我有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.

解决方法

你可能想在这里使用泛型:
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.您希望您的房产如何应对?

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读