Наследование от нескольких интерфейсов с одинаковым именем метода
Если у нас есть класс, который наследует от нескольких интерфейсов и интерфейсов имеют методы с одинаковыми именами, как мы можем реализовать эти методы в моем классе? Как мы можем указать, какой метод какого интерфейса реализован?
7 ответов:
путем реализации интерфейса явно, как это:
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"); } }при использовании явных реализаций интерфейса функции не являются общедоступными в классе. Поэтому для доступа к этим функциям необходимо сначала привести объект к типу интерфейса или назначить его переменной, объявленной типом интерфейса.
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();
вы должны использовать явная реализация интерфейса
вы можете реализовать один или оба этих интерфейса явно.
говорят, что у вас есть эти интерфейсы:
public interface IFoo1 { void DoStuff(); } public interface IFoo2 { void DoStuff(); }вы можете реализовать оба типа:
public class Foo : IFoo1, IFoo2 { void IFoo1.DoStuff() { } void IFoo2.DoStuff() { } }
иногда вам даже может понадобиться сделать:
public class Foo : IFoo1, IFoo2 { public void IFoo1.DoStuff() { } public void IFoo2.DoStuff() { ((IFoo1)this).DoStuff(); } }
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 }
public class ImplementingClass : AClass1, IClass1, IClass2 { public override string Method() { return "AClass1"; } string IClass1.Method() { return "IClass1"; } string IClass2.Method() { return "IClass2"; } }Итак, при вызове из другого класса вам придется привести объект в требуемый интерфейс или абстрактный класс.
ImplementingClass implementingClass = new ImplementingClass(); ((AClass1)implementingClass).Method();
вы можете реализовать один интерфейс явно и еще один неявно.
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будет реализация по умолчанию.Dual dual = new Dual(); dual.Test(); ((ITest2)dual).Test();выход:
Console.WriteLine("ITest.Test"); Console.WriteLine("ITest2.Test");
Comments