web-dev-qa-db-fra.com

Méthode scellée en C #

Je suis un débutant en C # .Je lis sur le mot-clé Sealed.J'ai des informations sur la classe scellée.J'ai lu une ligne sur la méthode Sealed où nous pouvons également créer la méthode Sealed.La ligne était (En déclarant la méthode scellée , nous pouvons éviter de surcharger cette méthode.) J'ai créé une démo mais je n'ai pas compris que la signification de la ligne ci-dessus et de la méthode scellée est utilisée. Ci-dessous mon code: -

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");
        }
    }


}

Veuillez me dire pourquoi nous utilisons les méthodes scellées et quels sont les avantages des méthodes scellées.

35
Mohit Kumar

Eh bien, vous testez avec seulement deux niveaux d'héritage, et vous n'obtenez pas au point de "surcharger" une méthode. Si vous en faites trois, vous pouvez voir ce que fait 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.
}
69
Mehrdad Afshari

Une class scellée est une classe qui ne peut pas être une classe de base d'une autre classe plus dérivée.

Une méthode scellée dans une classe non scellée est une méthode qui ne peut pas être remplacée dans une classe dérivée de cette classe.

Pourquoi utilisons-nous des méthodes scellées? Quels sont les avantages des méthodes scellées?

Eh bien, pourquoi utilisez-vous des méthodes virtuelles? Pour fournir un point auquel le comportement d'une classe peut être personnalisé. Alors pourquoi utilisez-vous des méthodes scellées? Pour fournir un point auquel vous êtes assuré qu'aucun autre changement ne se produira dans le comportement d'une classe dérivée par rapport à cette méthode.

Les points où le comportement d'une classe peut être personnalisé sont tile mais dangereux. Ils sont utiles car ils permettent aux classes dérivées de modifier le comportement de la classe de base. Ils sont dangereux ... attendez ... car ils permettent aux classes dérivées de changer le comportement de la classe de base. Les méthodes virtuelles permettent essentiellement à des tiers de faire faire à vos classes fo des choses que vous n'avez jamais anticipées ou testées.

J'aime écrire du code qui fait ce que j'anticipe et ce que j'ai testé. Sceller une méthode vous permet de continuer à autoriser le remplacement de parties de la classe tout en rendant les méthodes scellées dotées d'un comportement garanti, testable et stable qui ne peut pas être personnalisé davantage.

69
Eric Lippert

Eh bien, vous utiliseriez uniquement "scellé" sur une méthode si vous ne vouliez pas que des classes dérivées remplacent davantage votre méthode. Les méthodes sont scellées par défaut, si elles ne sont pas déclarées comme virtuelles et ne remplacent pas une autre méthode virtuelle. (En Java, les méthodes sont virtuelles par défaut - pour obtenir un comportement C # "par défaut", vous devez marquer une méthode comme final.)

Personnellement, j'aime contrôler soigneusement l'héritage - je préfère que des classes entières soient scellées dans la mesure du possible. Cependant, dans certains cas, vous souhaitez toujours autoriser l'héritage, mais assurez-vous que certaines méthodes ne sont pas outrepassées. Une utilisation pourrait être efficace modèle de la méthode , par exemple pour le diagnostic:

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);

Maintenant, les sous-classes ne peuvent pas remplacer Foo directement - elles devraient remplacer FooImpl, donc notre comportement sera toujours être exécuté quand un autre code appelle Foo.

Le modèle peut être pour d'autres raisons bien sûr - par exemple pour appliquer certains aspects de la validation des arguments.

D'après mon expérience, les méthodes scellées ne sont pas utilisées très souvent, mais je suis content que cette capacité existe. (Je souhaite juste que les cours soient scellés par défaut, mais c'est une autre conversation.)

20
Jon Skeet

Maintenant, si vous déclarez une sous-classe de Program, vous ne pourrez pas remplacer la méthode Test, c'est le point.

Dans la plupart des cas, vous n'aurez pas besoin de méthodes scellées, mais elles peuvent s'avérer utiles lorsque vous développez une classe de base pour un système de plug-in que les développeurs tiers doivent étendre afin de créer leur propre plug-in. Vous pouvez conserver certaines données de service telles que le nom du plugin et s'il est activé et utiliser des méthodes et des propriétés scellées pour le faire, afin que les développeurs de plugins ne s'en occupent pas. C'est un cas où les membres scellés sont utiles

1
Dyppl

Méthodes scellées

La méthode scellée est utilisée pour définir le niveau prioritaire d'une méthode virtuelle.

Le mot clé scellé est toujours utilisé avec le mot clé override.

Démonstration pratique d'une méthode scellée

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();
        }
    }
}
1
ravi chandra