【问题标题】:Derived Interface with derived interface member具有派生接口成员的派生接口
【发布时间】:2010-12-12 23:21:46
【问题描述】:

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

【问题讨论】:

    标签: c# interface view presenter


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案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; }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-19
        • 2017-12-26
        • 2018-08-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多