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