Интерфейс не принимает унаследованный член (вопрос ОО) - PullRequest
2 голосов
/ 14 октября 2008

Я чувствую себя как дурак, но здесь идет:

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 ]

5 голосов
/ 14 октября 2008

C # (на данный момент) имеет очень небольшую поддержку [co | contra] дисперсии; как таковая, реализация интерфейса должна иметь точное соответствие , включая тип возвращаемого значения. Чтобы сохранить ваш конкретный тип в API класса, я бы реализовал интерфейс явно - т.е. добавил:

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

Либо просто измените тип свойства на ErrorController - это может (или не может) дать то, что вам нужно.

1 голос
/ 14 октября 2008

Это правда; это не разрешено. (Правильное название - «Ковариантные типы возврата»)

Обратите внимание, что DSWebsiteController.ErrorController может физически возвращать объект DSErrorController; просто возвращаемое значение свойства должно быть определено как ErrorController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...