C#:接口:在两个接口中使用相同的方法
我有两个接口C#:接口:在两个接口中使用相同的方法,c#,interface,C#,Interface,我有两个接口 public interface I1 { string GetRandomString(); } public interface I2 { string GetRandomString(); } 在一节课上,我植入了 public class ClassA : I1, I2 { string I1.GetRandomString() { retur
public interface I1
{
string GetRandomString();
}
public interface I2
{
string GetRandomString();
}
在一节课上,我植入了
public class ClassA : I1, I2
{
string I1.GetRandomString()
{
return "GetReport I1";
}
string I2.GetRandomString()
{
return "GetReport I1";
}
}
现在在main方法中我想访问,但这些接口方法无法访问
static void Main(string[] args)
{
var objClassA = new ClassA();
objClassA.GetRandomString(); // not able to do this, comile time error ...
}
我知道,我缺少一些基本的OOPS东西,只是想知道。
有什么帮助吗 您应该将对象强制转换为特定的接口类型
static void Main(string[] args)
{
var objClassA = new ClassA();
I1 objClassAThreatedAsI1Interface = (I1)objClassA;
objClassAThreatedAsI1Interface.GetRandomString();
I2 objClassAThreatedAsI2Interface = (I2)objClassA;
objClassAThreatedAsI2Interface.GetRandomString();
}
您应该将对象强制转换为特定的接口类型
static void Main(string[] args)
{
var objClassA = new ClassA();
I1 objClassAThreatedAsI1Interface = (I1)objClassA;
objClassAThreatedAsI1Interface.GetRandomString();
I2 objClassAThreatedAsI2Interface = (I2)objClassA;
objClassAThreatedAsI2Interface.GetRandomString();
}
在ClassA中将两个GetRandomString方法标记为public。如果不提供访问修饰符,则默认为private。在ClassA中将两个GetRandomString方法标记为public。如果不提供访问修饰符,则默认为private。问题在于这些函数不是MyClass的成员函数,因为它们是定义的,I1.GetRandomString为I2.GetRandomString。您只能在其中一个接口上调用它们:
I1 objClassA = new ClassA();
objClassA.GetRandomString();
或
问题是这些函数不是MyClass的成员函数,因为它们是定义的,并且I1.GetRandomString作为I2.GetRandomString。您只能在其中一个接口上调用它们:
I1 objClassA = new ClassA();
objClassA.GetRandomString();
或
您需要将对象强制转换到定义要调用的方法版本的接口
如果您只想在类中定义方法的单个版本,请删除接口的显式定义(换句话说,从函数的第一个定义和整个I2.*方法中删除I1.)您需要将对象强制转换到定义要调用的方法版本的接口
如果您只想在类中定义方法的单一版本,请删除接口的显式定义(换句话说,从函数的第一个定义和整个I2.*方法中删除I1.)您可以将对象强制转换为所需的接口类型,然后调用该方法
if (objClassA is I1)
{
((I1)objClassA).GetRandomString();
}
if (objClassA is I2)
{
((I2)objClassA).GetRandomString();
}
您可以将对象强制转换为所需的接口类型,然后调用该方法
if (objClassA is I1)
{
((I1)objClassA).GetRandomString();
}
if (objClassA is I2)
{
((I2)objClassA).GetRandomString();
}
您已经显式地实现了接口。因此,方法实现属于接口,而不是您定义的类型。就编译器而言,该类型的方法不存在 您需要显式地将实例强制转换为要调用的接口并调用该方法(如其他实例所示) 或者更好,选择其中一个接口作为“主”接口,而不使用显式实现 i、 e
或者,只使用该方法的单个实现(而不使用显式实现)。您已经显式实现了接口。因此,方法实现属于接口,而不是您定义的类型。就编译器而言,该类型的方法不存在 您需要显式地将实例强制转换为要调用的接口并调用该方法(如其他实例所示) 或者更好,选择其中一个接口作为“主”接口,而不使用显式实现 i、 e
或者,只使用该方法的一个实现(而不使用显式实现)。如果有时需要使用一个接口,有时需要使用另一个接口,则可能需要对其中的最后一个接口使用强制转换。如果您控制类型,并且可以使其中一个接口函数直接可用,而不是作为显式实现,那么将避免对该接口函数进行强制转换的要求。为了避免对任一函数进行类型转换,您应该在对象中以单独的名称使它们可用。因为在C#中,任何实现anyInterface.Boz的方法都必须称为Boz,最好的方法可能是让IFoo.Boz和IBar.Boz的实现简单地调用名为FooBoz和BarBoz的公共方法,然后可以“直接”调用它们,而不会产生歧义 虽然类的转换接口成本很低,但结构的转换成本可能很高。在某些情况下,可通过使用以下静态方法避免此成本: public interface AliceFoo { void foo();}; public interface BobFoo { void foo();}; static void do_alice_foo<T>(ref T it) where T:AliceFoo { it.foo(); } static void do_bob_foo<T>(ref T it) where T : BobFoo { it.foo(); } 公共接口AliceFoo{void foo();}; 公共接口BobFoo{void foo();}; 静态void do_alice_foo(ref T it),其中T:AliceFoo { it.foo(); } 静态void do_bob_foo(ref T it),其中T:BobFoo { it.foo(); }
这种方法允许使用“foo”方法,而不必进行任何类型转换。如果有时需要使用一个接口,有时需要使用另一个接口,则可能需要对其中的最后一个接口进行转换。如果您控制类型,并且可以使其中一个接口函数直接可用,而不是作为显式实现,那么将避免对该接口函数进行强制转换的要求。为了避免对任一函数进行类型转换,您应该在对象中以单独的名称使它们可用。因为在C#中,任何实现anyInterface.Boz的方法都必须称为Boz,最好的方法可能是让IFoo.Boz和IBar.Boz的实现简单地调用名为FooBoz和BarBoz的公共方法,然后可以“直接”调用它们,而不会产生歧义 虽然类的转换接口成本很低,但结构的转换成本可能很高。在某些情况下,可通过使用以下静态方法避免此成本: public interface AliceFoo { void foo();}; public interface BobFoo { void foo();}; static void do_alice_foo<T>(ref T it) where T:AliceFoo { it.foo(); } static void do_bob_foo<T>(ref T it) where T : BobFoo { it.foo(); } 公共接口AliceFoo{void foo();}; 公共接口BobFoo{void foo();}; 静态void do_alice_foo(ref T it),其中T:AliceFoo { it.foo(); } 静态void do_bob_foo(ref T it),其中T:BobFoo { it.foo(); }
这种方法允许使用“foo”方法,而不必进行任何类型转换。不能使用访问修饰符进行显式接口实现。而且不可能对具有相同签名方法的两个不同接口使用隐式实现,否则两个接口将使用相同的实现