C# 从具有相同方法名称的多个接口继承
如果我们有一个从多个接口继承的类,并且这些接口有同名的方法,我们如何在我的类中实现这些方法?我们如何指定实现哪种接口的方法?您必须使用您可以实现其中一个或两个接口 假设您有以下接口:C# 从具有相同方法名称的多个接口继承,c#,inheritance,methods,interface,multiple-inheritance,C#,Inheritance,Methods,Interface,Multiple Inheritance,如果我们有一个从多个接口继承的类,并且这些接口有同名的方法,我们如何在我的类中实现这些方法?我们如何指定实现哪种接口的方法?您必须使用您可以实现其中一个或两个接口 假设您有以下接口: public interface IFoo1 { void DoStuff(); } public interface IFoo2 { void DoStuff(); } 您可以这样实现这两个功能: public class Foo : IFoo1, IFoo2 { void IFoo1
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
{
void ITest.Test() {
Console.WriteLine("ITest.Test");
}
void ITest2.Test() {
Console.WriteLine("ITest2.Test");
}
}
通过显式实现接口,如下所示:
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
{
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 class Foo : IFoo1, IFoo2
{
public void IFoo1.DoStuff() { }
public void IFoo2.DoStuff()
{
((IFoo1)this).DoStuff();
}
}
因此,当从不同的类调用时,必须将对象类型转换为所需的接口或抽象类
ImplementingClass implementingClass = new ImplementingClass();
((AClass1)implementingClass).Method();
您可以显式地实现一个接口,而显式地实现另一个接口
ITest.Test
将是默认实现。
Dual dual = new Dual();
dual.Test();
((ITest2)dual).Test();
输出:
Console.WriteLine("ITest.Test");
Console.WriteLine("ITest2.Test");
答案是“
举一个例子:
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();
}
}
输出:
大家好
您好,all-B与创建正确接口类型的临时接口相比?不用了,谢谢<代码>只读IFoo1 this1=this;这是1.DoStuff()代码>在显式接口实现中包含代码的可继承类通常会给派生类带来麻烦。我建议另一种模式是使用
protected
方法为两个接口成员编写代码,并将两个接口成员链接到该方法。将此转换为接口类型以使用其成员通常是一种重要的代码气味。最好有一个受保护的
方法来实现所讨论的成员并链接到该成员。如果Test()在接口和双类中都声明为public会怎么样?接口上的方法/属性始终是public的-这就是接口的整个点。但是,当您使用显式接口实现时,函数在类上始终是私有的。这就是为什么需要将类强制转换为所需的特定接口的技术。当您实现两个定义具有相同签名的方法的接口时,您无法避免这一点。请注意,这其中的另一个微妙“特征”是,即使每个方法具有相同的方法签名,它们也可以具有不同的返回类型。如果除了其中一个方法外,您没有对所有或所有方法使用显式接口声明,这通常是不允许的。@R.S.K如果Test()在Dual类中声明,则两个接口都将使用它作为实现。您将无法同时使用其他两个显式实现。
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();
}
}