以下是我的代码:
public interface I1
{
void method1();
}
public interface I2
{
void method1();
}
class MyClass
{
static void Main(string[] args)
{
One one = new One();
}
}
public class One :I1,I2
{
void I1.method1()
{
Console.WriteLine("This is method1 from Interface 1");
}
void I2.method1()
{
Console.WriteLine("This is method1 from Interface 2");
}
}
我有以下问题:
答案 0 :(得分:6)
我无法在类One中将方法声明为Public,因为它们是Interface方法。
这只是因为你正在使用explicit interface implementation。假设您确实需要两个不同的实现,您可以隐式地使一个:
public void method1()
{
Console.WriteLine("This is method1 from Interface 1");
}
void I2.method1()
{
Console.WriteLine("This is method1 from Interface 2");
}
注意现在我们可以指定public
访问修饰符,one.method1()
将调用该公共方法。显式接口实现只允许通过表达式访问该方法,该表达式的编译时类型是接口(而不是实现它的类)。
我无法在Main函数中调用MyClass实例中的这些Interface方法实现。
同样,仅因为您使用显式接口实现而one
变量的类型为One
。
基本上你可以用以下方法调用方法:
One one = new One();
I1 i1 = one;
I2 i2 = one;
i1.method1();
i2.method1();
或者只是演员:
((I1)one).method1();
((I2)one).method1();
答案 1 :(得分:2)
您有明确的接口实现。因此,您只能通过将实例强制转换为接口类型
来访问您的方法One one = new One();
I1 x = (I1)one;
x.method1();
答案 2 :(得分:1)
请注意,除了在类One
中实现明确分开的两个接口方法之外,您还可以选择将两个接口实现为单个方法,如果您不需要不同的实现,这些方法将是公共的:
public class One : I1, I2
{
public void method1()
{
Console.WriteLine("Combined");
}
}
在这种情况下,所有3种变体都将调用相同的方法:
var x = new One();
x.method1();
I1 i1 = x;
i1.method1();
I2 i2 = x;
i2.method1();
答案 3 :(得分:1)
这是我最喜欢的编程语言主题。之所以不可能是因为像C语言这样的语言不像我们在C语言中那样支持多继承,而且编译器可以选择识别正确的超类成员。实现C#编译器的方式,如果我们没有明确声明它,它不知道哪个成员是哪个。
如果我们被允许有多个同名的成员,那么就不可能知道哪一个是哪一个。
就像2个男人不知道哪个孩子是他们的,除非进行基因测试我们还没有明确地使用C#;)
和其他答案一样,就是这样:
One one = new One();
((I1)one).method1();
((I2)one).method1();
我们可以让一个公共使用一个这样的界面:
public void method1()
{
((I1)this).method1();
}