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

Запечатанный метод в С#

Я новичок в С#. Я читаю о Sealed ключевое слово. У меня есть опечатанный класс. Я прочитал строку о Sealed методе, где мы можем сделать Sealed метод. Линия была (методом объявления как запечатанный, мы можем избежать дальнейшего переопределения этого метода.) Я создал демонстрационную версию, но не понял, что используется значение вышеприведенной линии и запечатанного метода. Ниже мой код: -

using System;

namespace ConsoleApplication2
{
    class Program:MyClass
    {
        public override sealed void Test()
        {
            Console.WriteLine("My class Program");
        }
        static void Main(string[] args)
        {
            Program obj = new Program();
            obj.Test();
            Console.ReadLine();
        }
    }

    class MyClass
    {
        public virtual void Test()
        {
            Console.WriteLine("My class Test");
        }
    }


}

Скажите, пожалуйста, почему мы используем Sealed методы и каковы преимущества Sealed методов.

4b9b3361

Ответ 1

Ну, вы тестируете только два уровня наследования, и вы не понимаете, что вы "еще более переопределяете" метод. Если вы сделаете три, вы увидите, что делает sealed:

class Base {
   public virtual void Test() { ... }
}
class Subclass1 : Base {
   public sealed override void Test() { ... }
}
class Subclass2 : Subclass1 {
   public override void Test() { ... } // Does not compile!
   // If `Subclass1.Test` was not sealed, it would've compiled correctly.
}

Ответ 2

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

Запечатанный метод в незапечатанном классе - это метод, который нельзя переопределить в производном классе этого класса.

Почему мы используем закрытые методы? Каковы преимущества запечатанных методов?

Хорошо, почему вы используете виртуальные методы? Предоставить точку, в которой поведение класса может быть настроено. Итак, почему вы используете запечатанные методы? Чтобы обеспечить точку, в которой вам гарантировано, что никаких дальнейших изменений в поведении какого-либо производного класса в отношении этого метода не произойдет.

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

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

Ответ 3

Ну, вы использовали бы только "запечатанный" метод, если бы вы не хотели, чтобы производные классы больше переопределяли ваш метод. Методы запечатываются по умолчанию, если они не объявлены как виртуальные, а не переопределяют другой виртуальный метод. (В Java методы по умолчанию виртуальны - для достижения поведения по умолчанию "по умолчанию" вы должны пометить метод как final.)

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

public sealed override void Foo(int x)
{
    Log("Foo called with argument: {0}", x);
    FooImpl(x);
    Log("Foo completed");
}

protected abstract void FooImpl(int x);

Теперь подклассы не могут переопределить Foo напрямую - им придется переопределить FooImpl, поэтому наше поведение всегда будет выполняться, когда другие вызовы кода Foo.

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

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

Ответ 4

Теперь, если вы объявляете подкласс программы, вы не сможете переопределить метод Test, что точка.

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

Ответ 5

Запечатанные методы

Запечатанный метод используется для определения уровня переопределения виртуального метода.

Запечатанное ключевое слово всегда используется с ключевым словом переопределения.

Практическая демонстрация запечатанного метода

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace sealed_method
{
    class Program
    {
        public class BaseClass
        {

            public virtual void Display()
            {
                Console.WriteLine("Virtual method");
            }
        }

       public class DerivedClass : BaseClass
        {
            // Now the display method have been sealed and can;t be overridden
            public override sealed void Display()
            {
                Console.WriteLine("Sealed method");
            }
        }

       //public class ThirdClass : DerivedClass
       //{

       //    public override void Display()
       //    {
       //        Console.WriteLine("Here we try again to override display method which is not possible and will give error");
       //    }
       //}

        static void Main(string[] args)
        {

            DerivedClass ob1 = new DerivedClass();
            ob1.Display();

            Console.ReadLine();
        }
    }
}

Ответ 6

С# имеет это, потому что Java имеет идентичную функцию (методы final). Я никогда не видел законного использования.

Если вы не хотите разрешать расширение, весь класс должен быть помечен sealed, а не только один метод.