【问题标题】:Interface doesn't accept inherited member (OO question)接口不接受继承的成员(OO 问题)
【发布时间】:2008-10-14 13:39:00
【问题描述】:

我觉得自己像个傻瓜,但这里是:

public interface IHasErrorController{
  ErrorController ErrorController { get; set; }
}

public class DSErrorController: ErrorController{yadi yadi ya}

public class DSWebsiteController : Controller, IHasErrorController{
    public DSErrorController ErrorController { get; set; }
}

这给了我一个错误,说 DSWebsiteController.ErrorController 无法实现 IHasErrorController 尽管 DSErrorController 是从 ErrorController 继承的。

此外,欢迎提出更好的命名建议,以便 ErrorController 类型和字段 Errorcontroller 看起来不一样(命名很难)。

【问题讨论】:

    标签: c# oop


    【解决方案1】:

    C#(目前)几乎没有 [co|contra]variance 支持;因此,接口实现必须是 exact 匹配,包括返回类型。为了使您的 concreate 类型保留在类 API 上,我将显式实现该接口 - 即添加:

    ErrorController IHasErrorControlloer.ErrorController {
      get {return this.ErrorController;}
      set {this.ErrorController = (DSErrorController)value;}
    }
    

    或者,只需将属性类型更改为 ErrorController - 这可能(或可能不会)满足您的需求。

    【讨论】:

    • 使用您的代码解决方案,您的意思是在您的设置器中放置一个演员,对吧?只是确保我完全理解。
    【解决方案2】:

    这是真的;这是不允许的。 (正确的名称是“协变返回类型”)

    注意 DSWebsiteController.ErrorController 可以物理地返回一个 DSErrorController 对象;只是属性的返回值必须定义为ErrorController。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 2011-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-24
      • 2011-06-14
      相关资源
      最近更新 更多