Как запретить переопределение метода/свойства класса В C#?

Я считаю, что хочу, чтобы некоторые методы и свойства класса были unoverridable и использовали реализацию базы во всех производных классах. Как этого достичь? запечатанное ключевое слово, похоже, не работает и говорит: "метод не может быть запечатан, потому что это не переопределение".

5 ответов


члены по умолчанию запечатаны в C# - если они не помечены как виртуальные, их все равно нельзя переопределить в производных классах.

они могут быть тени в производных классах, по общему признанию:

public new void SomeMethod()
{
}

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

Если вы смогли дать нам больше деталей ровно то, что вы пытаетесь предотвратить (как от POV вызывающего абонента, так и от вызываемого кода), мы можем помочь больше.


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

class A
{
    public void B() {} // can't override
    public virtual C() {} // can override
    public virtual D() {} // can override
}

на sealed модификатор применяется только тогда, когда метод уже переопределение члена в базовом классе. Это позволяет предотвратить переопределения в подклассах это класса.

class A1 : A
{
    public void B() {} // shadows A.B.  Not a virtual method!
    public override C() {} // overrides A.C, subclasses can override
    public override sealed D() {} // overrides A.D, subclasses cannot override
                                  // (but can shadow)
}

Это невозможно. Производный класс всегда может использовать ключевое слово new to скрыть (не переопределять) методы своих родителей. Ключевое слово sealed просто останавливает переопределение виртуального метода производным классом, но может использовать new Для скрытия базового метода.


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

как указал другой, на самом деле существует ключевое слово "new", которое позволяет скрыть метод. Но пока вы используете ссылку на свой базовый класс, ваш базовый метод всегда называется:

class BaseClass
{
     public void Foo() { Console.WriteLine("Foo"); }
}

class Derived : BaseClass
{
     public new void Foo() { Console.WriteLine("Bar"); }
}

public static void Main()
{
     Derived derived = new Derived();
     derived.Foo(); // Prints "Bar"
     BaseClass baseClass = derived;
     baseClass.Foo(); // Prints "Foo"
}

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


именно sealed ключевое слово для.

http://msdn.microsoft.com/en-us/library/ms173150.aspx

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

если вы переопределили метод из базового класса, чем use sealed. Если вы объявили метод в классе и не хотите, чтобы он был переопределен в любых производных классах, чем не пометить его как virtual. Только virtual члены могут быть переопределены.