我有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.您希望您的房产如何应对?
上面的通用版本通过允许演示者表达它呈现的视图类型来解决这个问题.
原文地址:https://www.jb51.cc/csharp/92241.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。