C# 无法从其他类调用接口方法
下面是我的代码:C# 无法从其他类调用接口方法,c#,oop,C#,Oop,下面是我的代码: 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() {
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");
}
}
我有以下问题:
您有显式的接口实现。因此,您只能通过将实例强制转换为接口类型来访问方法
One one = new One();
I1 x = (I1)one;
x.method1();
我无法在类1中将方法声明为Public,因为它们是接口方法
那只是因为你在使用。假设您确实需要这两种不同的实现,您可以将其中一种实现隐式化:
public void method1()
{
Console.WriteLine("This is method1 from Interface 1");
}
void I2.method1()
{
Console.WriteLine("This is method1 from Interface 2");
}
注意现在我们如何指定public
access修饰符,并且one.method1()
将调用该public方法。显式接口实现只允许通过编译时类型为接口(而不是实现接口的类)的表达式访问方法
我无法从主函数中的MyClass实例调用这些接口方法实现
同样,这仅仅是因为您使用的是显式接口实现,并且您的one
变量的类型是one
基本上,您可以使用以下方法调用这些方法:
One one = new One();
I1 i1 = one;
I2 i2 = one;
i1.method1();
i2.method1();
或者只是演员:
((I1)one).method1();
((I2)one).method1();
请注意,除了实现类
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();
这是编程语言中我最喜欢的主题之一。之所以不可能,是因为像C#这样的语言不支持多重继承,就像我们在像C这样的语言中使用的那样,这是编译器识别正确的超类成员的选择。C#编译器的实现方式是,如果我们不明确声明,它就不知道哪个成员是哪个 如果我们被允许有多个同名的成员,那么就不可能知道哪个是哪个盒子 就像两个男人不知道哪一个孩子是他们的,除非进行基因测试,而我们还没有对C#进行明确的测试。) 和其他人一样,答案是这样的:
One one = new One();
((I1)one).method1();
((I2)one).method1();
public void method1()
{
((I1)this).method1();
}
我们可以有一个public,它使用这样一个接口:
One one = new One();
((I1)one).method1();
((I2)one).method1();
public void method1()
{
((I1)this).method1();
}
此线程可能很有用:感谢Jon的详细解释。我认为method1()是在最后一行中使用的,而不是method2();)