Подтвердить что ты не робот

Добавление свойств к интерфейсу предотвращает создание закрытого/защищенного "набора" в производных типах?

Изменить: Оказывается, я пропустил что-то очевидное, но я собираюсь оставить вопрос открытым, если кто-то другой совершит ту же очевидную ошибку. Спасибо тем, кто указал на это См. Пояснение для объяснения.

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

Возможно, у меня есть глупый момент, но мне кажется, что наличие свойства, определенного в интерфейсе, подразумевает, что ни один класс-получатель не может предоставить какой-либо непубличный набор для указанного свойства.

Пример:

interface IField
{
    bool IsValid { get; }
}

... и поскольку свойства интерфейса могут не иметь модификаторов доступности, это означает, что:

class Field : IField
{
    public override bool IsValid { get; protected set; }
}

... не будет возможным, несмотря на то, что он концептуально отвечает требованиям интерфейса.

IMO это имеет большие отрицательные последствия для инкапсуляции, которые могут быть сделаны с помощью непубличных свойств, и предотвращает использование нескольких шаблонов общего использования для свойств.

Я знаю, что вы можете создать непубличный член SetIsValid, который модифицирует общее хранилище резервных копий, но это создаст непоследовательный шаблон и добавит то, что в противном случае было бы кодовым шумом, если бы не было необходимости.

Я что-то пропустил?


Изменить: Да, я пропустил что-то

Сейчас я изменяю код другого пользователя и понимаю, что класс, с которым я боролся, реализовал интерфейс и получил базовый класс. И я новичок в С#. Это вызвало замешательство.

фактический класс выглядел так:

class Field : IField, BaseField
{
    public override bool IsValid { get; protected set; }
}

... где BaseField также реализовал интерфейс, но не реализовал набор.

4b9b3361

Ответ 1

Это совершенно законно. Вам не нужно ключевое слово override (на самом деле оно не будет компилироваться), но вам ничего не мешает:

interface IField
{
    bool IsValid { get; }
}

class Field : IField
{
    public bool IsValid { get; protected set; }
}

Ответ 2

Возможно на интерфейсах, но не на абстрактных/виртуальных свойствах. Возможно, эти два смешались.