Переопределить получить, но не установить - PullRequest
71 голосов
/ 08 января 2010

У меня есть абстрактный класс, который определяет get, но не set, потому что для этого абстрактного класса ему нужен только get.

public abstract BaseClass
{
  public abstract double MyPop
  {get;}
}

Однако в некоторых классах производных мне нужно свойство set, поэтому я смотрю на эту реализацию

public class DClass: BaseClass
{
  public override double MyPop
  {get;set;}
}

Проблема в том, что я получил ошибку компиляции, говоря, что

*. Set: невозможно переопределить, потому что *. не имеет переопределенного набора доступа.

Хотя я думаю, что приведенный выше синтаксис совершенно законен.

Есть идеи по этому поводу? Обходной путь или почему это так?

Редактировать: Единственный подход, который я могу придумать, - это поставить get и set как в абстрактном классе, и позволить подклассу выбросить NotImplementedException, если вызывается set и это не обязательно. Это то, что мне не нравится, а также специальный метод установки .

Ответы [ 13 ]

0 голосов
/ 08 января 2010

EDIT:

Хорошо. Возможно, я поспешил с этим ответом, но сейчас я обдумал его.

Вам нужно использовать абстрактный базовый класс? Если это не требуется, попробуйте это:

public interface ISomeRelevantName
{
    double MyPop { get; }
}

public class DClass : ISomeRelevantName
{
    public double MyPop { get; set; }
}
0 голосов
/ 08 января 2010

Вы не можете переопределить метод доступа set, так как в базовом классе не определен метод доступа set.

Что вы можете сделать, это использовать ключевое слово new, чтобы скрыть реализацию базовых классов, но это может быть не то, что вам нужно.

0 голосов
/ 08 января 2010

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

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