Невозможно запечатать, потому что это не переопределение

У меня есть следующий класс:

namespace Warnings
{
    public abstract class BaseWarningIntField : IWarningInnerDataField
    {
        public string PropName;

        public string HeaderCaption;

        public sealed WarningInnerDataType DataType
        {
            get { return WarningInnerDataType.Integer; }
        }
    }
}

Я хочу, чтобы последнее свойство DataType не было переопределяемым, поскольку это базовый класс для поля сведений о предупреждении типа Integer, поэтому он должен всегда возвращать правильный тип WarningInnerDataType.Integer.

В любом случае, компилятор выдает мне следующую ошибку:

«Warnings.BaseWarningIntField.DataType» не может быть запечатан, поскольку это не переопределение

Но, насколько мне известно, override делает прямо противоположное тому, чего я пытаюсь добиться.


person Teejay    schedule 27.03.2013    source источник
comment
Почему бы вам не попробовать переопределить этот метод в вашей конкретной реализации? Вы можете переосмыслить этот вопрос после небольшого эксперимента.   -  person Austin Salonen    schedule 27.03.2013
comment
Только тогда не делайте это виртуальным, не нужно его запечатывать.   -  person Brandon Moretz    schedule 27.03.2013
comment
поочередно использовать статические только для чтения   -  person Dhawalk    schedule 27.03.2013
comment
@0A0D и методы тоже. См. раздел 10.6.5 спецификации языка C#.   -  person Brian Rasmussen    schedule 27.03.2013


Ответы (1)


в C# все методы по умолчанию не виртуальные. Вы не можете переопределить не виртуальный метод в подклассах. Таким образом, оставив свойство как обычно, вы защитите его от переопределения подклассом.

Sealed — это ключевое слово, используемое в объявлении класса для ограничений наследования или для остановки виртуальной цепочки членов иерархии классов. Но опять же — это касается виртуальных методов и свойств.

Попытка переопределить свойство «нормальное» в подклассе приведет к ошибке компиляции.

«WarningIntField.DataType.get»: не может переопределить унаследованный член «BaseWarningIntField.DataType.get», поскольку он не помечен как виртуальный, абстрактный или переопределенный.

Чтобы ответить на ваш комментарий, я приведу несколько примеров кода, иллюстрирующих мою точку зрения. На самом деле вы не можете запретить производным классам скрывать метод или свойство. Итак, следующая ситуация является законной, и ее невозможно преодолеть (это также относится к виртуальному методу и методам, обозначенным ключевым словом new)

class BaseClass
{
    public string Property {get; set;}
}

class DerivedClass : BaseClass
{
    //compiler will give you a hint here, that you are hiding a base class prop
    public string Property {get; set;}
}

Точно так же вы не можете ограничить скрытие поля в классе локальной переменной, так что эта ситуация также допустима. Обратите внимание, что компилятор также поможет вам заметить, что вы прячете поле класса в локальной переменной. Это также относится к полям readonly const и простым полям static.

int field = 0; //class field
void Foo()
{
    int field = 0; //local variable
}
person Ilya Ivanov    schedule 27.03.2013
comment
Из MSDN: Вы также может использовать модификатор seal для метода или свойства, которое переопределяет виртуальный метод или свойство в базовом классе. Это позволяет вам разрешить классам быть производными от вашего класса и запретить им переопределять определенные виртуальные методы или свойства. - person Austin Salonen; 27.03.2013
comment
@AustinSalonen спасибо за внимание. Забыл, что можно остановить виртуальную цепочку, запечатав. Но опять же, это используется для виртуальных методов - person Ilya Ivanov; 27.03.2013
comment
Ладно, я понял. Но есть ли способ запретить другим скрывать мой метод? В настоящее время любой может сделать это, написав одно с тем же именем. - person Teejay; 28.03.2013
comment
@Teejay Я добавил некоторые пояснения и коды к ответу, который вы прокомментировали. - person Ilya Ivanov; 28.03.2013
comment
Интересно. Таким образом, sealed конкретно означает предотвращение дальнейшего переопределения этого уже виртуального метода, а не просто предотвращение переопределения этого метода. - person Stewart; 21.11.2017