Si nous avons une classe qui hérite de plusieurs interfaces et que les interfaces ont des méthodes portant le même nom, comment pouvons-nous implémenter ces méthodes dans ma classe? Comment pouvons-nous spécifier quelle méthode de quelle interface est implémentée?Héritage de plusieurs interfaces portant le même nom de méthode
Répondre
En mettant en œuvre l'interface explicitement, comme ceci:
public interface ITest {
void Test();
}
public interface ITest2 {
void Test();
}
public class Dual : ITest, ITest2
{
void ITest.Test() {
Console.WriteLine("ITest.Test");
}
void ITest2.Test() {
Console.WriteLine("ITest2.Test");
}
}
Lorsque vous utilisez Implémentations d'interface explicites, les fonctions ne sont pas publiques sur la classe. Par conséquent, pour accéder à ces fonctions, vous devez d'abord convertir l'objet en type d'interface, ou l'affecter à une variable déclarée du type d'interface.
var dual = new Dual();
// Call the ITest.Test() function by first assigning to an explicitly typed variable
ITest test = dual;
test.Test();
// Call the ITest2.Test() function by using a type cast.
((ITest2)dual).Test();
Vous devez utiliser explicit interface implementation
Vous pouvez mettre en œuvre un ou les deux de ces interfaces explicitly.
Dites que vous avez ces interfaces:
public interface IFoo1
{
void DoStuff();
}
public interface IFoo2
{
void DoStuff();
}
Vous pouvez mettre en œuvre à la fois comme ceci:
public class Foo : IFoo1, IFoo2
{
void IFoo1.DoStuff() { }
void IFoo2.DoStuff() { }
}
Parfois, vous pouvez même avoir besoin de faire:
public class Foo : IFoo1, IFoo2
{
public void IFoo1.DoStuff() { }
public void IFoo2.DoStuff()
{
((IFoo1)this).DoStuff();
}
}
Par rapport à la création temporaire d'un type d'interface correct? Non merci. 'readonly IFoo1 this1 = ceci; this1.DoStuff(); ' –
Les classes héritables qui incluent du code dans les implémentations d'interface explicites provoquent souvent des problèmes pour les classes dérivées. Je suggérerais comme un modèle alternatif ayant une méthode «protégée» avec le code pour les deux membres d'interface, et ayant les deux membres d'interface en chaîne à cela. Couler 'this' à un type d'interface dans le but d'utiliser un membre de celui-ci est généralement une odeur de code significative. Mieux vaut avoir une méthode «protégée» qui implémente le membre en question et enchaîne à cela. – supercat
public class ImplementingClass : AClass1, IClass1, IClass2
{
public override string Method()
{
return "AClass1";
}
string IClass1.Method()
{
return "IClass1";
}
string IClass2.Method()
{
return "IClass2";
}
}
Donc lorsque vous appelez de différentes classes, vous devrez taper jeter l'objet dans l'interface requise ou classe abstraite.
ImplementingClass implementingClass = new ImplementingClass();
((AClass1)implementingClass).Method();
public interface IDemo1
{
void Test();
}
public interface IDemo2
{
void Test();
}
public class clsDerived:IDemo1,IDemo2
{
void IDemo1.Test()
{
Console.WriteLine("IDemo1 Test is fine");
}
void IDemo2.Test()
{
Console.WriteLine("IDemo2 Test is fine");
}
}
public void get_methodes()
{
IDemo1 obj1 = new clsDerived();
IDemo2 obj2 = new clsDerived();
obj1.Test();//Methode of 1st Interface
obj2.Test();//Methode of 2st Interface
}
Vous pouvez implémenter une interface Explicitement et une autre implecitely.
public interface ITest {
void Test();
}
public interface ITest2 {
void Test();
}
public class Dual : ITest, ITest2
{
public void Test() {
Console.WriteLine("ITest.Test");
}
void ITest2.Test() {
Console.WriteLine("ITest2.Test");
}
}
ITest.Test
sera la mise en œuvre par défaut .
Dual dual = new Dual();
dual.Test();
((ITest2)dual).Test();
Sortie:
Console.WriteLine("ITest.Test");
Console.WriteLine("ITest2.Test");
- 1. Ajout de plusieurs ressources portant le même nom à Xcode pour iPhone
- 2. Classe CSS et ID portant le même nom
- 3. asp.net webforms - comment gérer plusieurs pages portant le même nom dans un projet Web?
- 4. même instance pour plusieurs interfaces
- 5. héritage multiple python à partir de chemins différents avec le même nom de méthode
- 6. Héritage et interfaces .NET
- 7. option de lecture de trois balises de sélection portant le même nom
- 8. Interface héritage et sous-interfaces
- 9. Mise à jour des valeurs de table d'une autre table portant le même nom d'utilisateur
- 10. Affectation d'un élément de tableau à une variable portant le même nom?
- 11. Impossible de supprimer l'un des deux COM portant le même nom.
- 12. Le raccourci WiX écrase le raccourci existant portant le même nom
- 13. classe héritant de plusieurs interfaces ayant la même signature de la méthode
- 14. L'importation du module portant le même nom qu'un module intégré provoque une erreur d'importation
- 15. Interfaces, héritage et formes de fenêtres dans C#
- 16. Castle Windsor Enregistrement de plusieurs interfaces sur un même service
- 17. Plusieurs processus avec le même nom
- 18. Plusieurs cookies avec le même nom
- 19. Se moquer de plusieurs interfaces
- 20. Plusieurs blocs de même nom dans Jinja2
- 21. Problème avec deux tables portant le même nom dans différents modèles MVC?
- 22. Comment transformer un élément enfant en majuscule si un élément enfant portant le même nom existe?
- 23. Rails HABTM fields_for - vérifier si l'enregistrement portant le même nom existe déjà
- 24. Comment accéder à deux colonnes portant le même nom dans une requête MySQL LEFT JOIN?
- 25. Héritage .NET avec des interfaces génériques
- 26. Héritage et surcharge de méthode
- 27. Comment wsgi gère-t-il plusieurs en-têtes de requête avec le même nom?
- 28. Héritage de la méthode principale
- 29. Héritage par rapport aux colonnes communes (même nom et typé)?
- 30. Comment identifier les champs de différentes tables portant le même nom dans un résultat de requête JOIN?
si Test() est déclarée public dans les deux interfaces et la double classe? –
Les méthodes/propriétés d'une interface sont toujours publiques, c'est-à-dire le point entier d'une interface. Mais lorsque vous utilisez une implémentation d'interface explicite, la fonction sera toujours privée sur la classe. C'est pourquoi vous avez besoin de la technique pour transformer la classe en l'interface spécifique dont vous avez besoin. Lorsque vous implémentez deux interfaces qui définissent des méthodes avec une signature identique, vous ne pouvez pas éviter cela. – Pete
Notez qu'une autre "caractéristique" subtile de ceci est que chaque méthode peut avoir un type de retour différent même s'ils ont la même signature de méthode. Si vous n'utilisez pas de déclaration d'interface explicite sur toutes ou toutes les méthodes sauf une, cela n'est normalement pas autorisé. – NightOwl888