Maison > développement back-end > Tutoriel C#.Net > Modèle de conception C# - Exemple de partage de code pour les classes dérivées afin d'implémenter des interruptions d'interface non virtuelles

Modèle de conception C# - Exemple de partage de code pour les classes dérivées afin d'implémenter des interruptions d'interface non virtuelles

黄舟
Libérer: 2017-03-18 13:23:43
original
1396 Les gens l'ont consulté

Comprendre la différence entre les méthodes d'interface et les méthodes virtuelles

À première vue, il ne semble y avoir aucune différence entre implémenter une interface et remplacer une méthode virtuelle. En fait, la différence entre implémenter une interface et remplacer une méthode virtuelle. la méthode virtuelle est très grande ! ! !

Les classes dérivées ne peuvent pas remplacer les membres non virtuels de l'interface

Les méthodes membres déclarées dans l'interface ne sont pas des méthodes virtuelles par défaut, Les classes dérivées ne peuvent pas remplacer les classes de base qui implémentent le. interface Membres non virtuels .
Regardez un exemple.
Définir l'interface ITest :

    public interface ITest
    {        void Test();
    }
Copier après la connexion

Classe de base et classe Derive qui implémentent l'interface

    public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        //实现ITest接口
        public void Test()
        {
            Console.WriteLine("This is in base to ITest implement");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }        //测试Derive类实现了ITest吗??
        public void Test()
        {
            Console.WriteLine("This is in Derive to ITest implement");
        }
    }
Copier après la connexion

Appeler Object Base et Derive :

            Base b = new Base();
            b.Test();

            Base d = new Derive();//将d声明为Base对象
            d.Test();
            Console.ReadLine();
Copier après la connexion

Le résultat de sortie est :


Modèle de conception C# - Exemple de partage de code pour les classes dérivées afin dimplémenter des interruptions dinterface non virtuelles

On peut voir que le comportement implémenté par la méthode Test des instances b et d est situé dans la base En quelque sorte ! ! ! Cela montre que Les classes dérivées ne peuvent pas remplacer les membres (méthodes non virtuelles) des classes de base qui implémentent des interfaces

Cependant, veuillez consulter l'appel suivant :

            Base b = new Base();
            b.Test();
            Derive d = new Derive(); //将d声明为Derive对象
            d.Test();
            Console.ReadLine();
Copier après la connexion

Output Le résultat est :


Modèle de conception C# - Exemple de partage de code pour les classes dérivées afin dimplémenter des interruptions dinterface non virtuelles

Par conséquent, si vous souhaitez qu'un objet qui hérite de appelle la méthode d'implémentation de l'interface, vous ne pouvez que déclarez-le comme instance Derive. Cela n'est pas conforme au principe selon lequel les variables en C# sont déclarées comme instances de base ! ! ! Personnalité de la méthode de classe dérivée, convertissez la méthode de classe de base en méthode virtuelle

Pour éviter cette confusion d'utilisation, s'il est vrai que la méthode d'implémentation de la classe dérivée est un comportement de personnalité, alors l'implémentation de la classe de base doit être Ajoutez le modificateur virtuel avant la méthode d'interface !

Le code est modifié comme suit :


Une implémentation, plusieurs objets associés utilisent

public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        public virtual void Test() //实现ITest接口的虚方法
        {
            Console.WriteLine("This is in base to ITest implemnt");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }         public override void Test() //实现接口ITest的复写方法
        {
            Console.WriteLine("This is in Derive to ITest implemnt");
        }
    }
Copier après la connexion
En observant le code ci-dessus, nous avons constaté que l'interface implémentée dans la classe de base, si le classe dérivée également Si vous souhaitez implémenter cette interface, elle hérite par défaut de l'implémentation de l'interface de la classe de base, vous n'avez donc pas besoin d'écrire du code à plusieurs reprises pour implémenter l'interface.

Résumé :

1. La dérivation ne peut pas remplacer les membres non virtuels de l'interface
   public interface ITest
    {        void Test();
    }    public class Base:ITest
    {        public Base()
        {
            Console.WriteLine("This is base constructor");
        }        public void Test()
        {
            Console.WriteLine("This is in base to ITest implemnt");
        }
    }    public class Derive :Base,ITest
    {        public Derive()
        {
            Console.WriteLine("This is derived constructor");

        }
    }
Copier après la connexion
2 Si la méthode de classe dérivée est une méthode personnalisée, convertissez la méthode de classe de base en une méthode virtuelle ; method;

3. Si la classe de base implémente la méthode d'interface, la classe dérivée héritera également explicitement de cette interface, mais il n'est pas nécessaire de l'implémenter à nouveau ! ! !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal