无法从另一个类调用接口方法
本文关键字:调用 接口 方法 另一个 | 更新日期: 2023-09-27 18:34:39
下面是我的代码:
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");
}
}
我有以下问题:
- 我无法在 1 类中将方法声明为 Public,因为这些是接口方法。
- 我无法从 Main 函数中的 MyClass 实例调用这些接口方法实现。
我无法在 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
访问修饰符,one.method1()
将调用该公共方法。显式接口实现仅允许通过编译时类型为接口(而不是实现它的类(的表达式访问该方法。
我无法从 Main 函数中的 MyClass 实例调用这些接口方法实现。
同样,只是因为您使用的是显式接口实现,并且您的one
变量的类型为 One
。
基本上你可以用以下命令调用这些方法:
One one = new One();
I1 i1 = one;
I2 i2 = one;
i1.method1();
i2.method1();
或者只是投射:
((I1)one).method1();
((I2)one).method1();
你有明确的接口实现。因此,您只能通过将实例转换为接口类型来访问您的方法
One one = new One();
I1 x = (I1)one;
x.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();
}