【发布时间】:2011-01-23 04:36:56
【问题描述】:
如果我们有一个继承自多个接口的类,并且这些接口有同名的方法,我们如何在我的类中实现这些方法?如何指定实现哪个接口的哪个方法?
【问题讨论】:
标签: c# inheritance methods interface multiple-inheritance
如果我们有一个继承自多个接口的类,并且这些接口有同名的方法,我们如何在我的类中实现这些方法?如何指定实现哪个接口的哪个方法?
【问题讨论】:
标签: c# inheritance methods interface multiple-inheritance
通过显式实现接口,如下所示:
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();
【讨论】:
【讨论】:
您可以实现这些接口中的一个或两个explicitly。
假设你有这些接口:
public interface IFoo1
{
void DoStuff();
}
public interface IFoo2
{
void DoStuff();
}
您可以像这样实现两者:
public class Foo : IFoo1, IFoo2
{
void IFoo1.DoStuff() { }
void IFoo2.DoStuff() { }
}
【讨论】:
您可以实现一个显式接口和另一个隐式。
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");
【讨论】:
有时您甚至可能需要这样做:
public class Foo : IFoo1, IFoo2
{
public void IFoo1.DoStuff() { }
public void IFoo2.DoStuff()
{
((IFoo1)this).DoStuff();
}
}
【讨论】:
readonly IFoo1 this1 = this; this1.DoStuff();
protected 方法,其中包含两个接口成员的代码,并且两个接口成员都链接到该方法。将this 转换为接口类型以使用其成员通常是一种明显的代码异味。最好有一个protected 方法来实现相关成员并链接到该成员。
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 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
}
【讨论】:
答案是“By using explicit Interface implementation”
举个例子:
using System;
interface A
{
void Hello();
}
interface B
{
void Hello();
}
class Test : A, B
{
void A.Hello()
{
Console.WriteLine("Hello to all-A");
}
void B.Hello()
{
Console.WriteLine("Hello to all-B");
}
}
public class interfacetest
{
public static void Main()
{
A Obj1 = new Test();
Obj1.Hello();
B Obj2 = new Test();
Obj2.Hello();
}
}
输出:
Hello to all-A
Hello to all-B
【讨论】:
Dual dual = new Dual();
(dual as ITest).Test();
(dual as ITest2).Test();
您可以将其用于您的代码
【讨论】: