Maison > Article > développement back-end > 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
À 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 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(); }
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"); } }
Appeler Object Base et Derive :
Base b = new Base(); b.Test(); Base d = new Derive();//将d声明为Base对象 d.Test(); Console.ReadLine();
Le résultat de sortie est :
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();
Output Le résultat est :
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 !
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"); } }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'interfacepublic 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"); } }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!