接口不接受继承成员(OO问题)

时间:2008-10-14 13:39:00

标签: c# oop

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

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看起来不一样(欢迎命名)。

2 个答案:

答案 0 :(得分:5)

C#(目前)支持很少[共同]差异;因此,接口实现必须是完全匹配,包括返回类型。为了在类API上保留你的concreate类型,我会明确地实现接口 - 即添加:

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

或者,只需将属性类型更改为ErrorController - 这可能(或可能不会)提供您需要的内容。

答案 1 :(得分:1)

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

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