gpt4 book ai didi

c# - 如何通过保留方法名称来扩展接口(interface)?

转载 作者:行者123 更新时间:2023-11-30 13:10:35 25 4
gpt4 key购买 nike

给定两个接口(interface):

interface I1 {
int Foo();
}

interface I2 {
void Foo();
}

还有一个类:

class Test : I1, I2 {
int I1.Foo() {
Console.WriteLine("I1.Foo");
return default(int);
}

public void Foo() {
Console.WriteLine("I2.Foo");
}
}

如何通过保留名为 Foo 的方法,用 I1 扩展接口(interface) I2

我尝试了以下代码,但它没有编译:

interface I1 {
int Foo();
}

interface I2 : I1 {
void I2.Foo();
}

class Test : I2 { /* same code */ }

最佳答案

示例中不清楚在接口(interface)中显式声明 I2.Foo() 如果允许的话会完成什么。规范(第 13.4.1 节)允许实现接口(interface)的结构或类声明显式成员实现。 (接口(interface)不能声明任何实现,无论是显式的还是其他方式)。

因此,假设我们定义了:

interface IFoo
{
void Bar();
}

interface IBaz : IFoo
{
new void Bar();
}

interface IQux : IBaz { }

class A : IQux // equivalent to class A : IQux, IBaz, IFoo (spec sec. 13.4.6)
{
void IFoo.Bar()
{
Console.WriteLine("IFoo.Bar");
}

void IBaz.Bar()
{
Console.WriteLine("IBaz.Bar");
}

public void Bar()
{
Console.WriteLine("A.Bar");
}

// Not allowed: void IQux.Bar() {...}
// Since "The fully-qualified name of the interface member
// must reference the interface in which the member
// was declared" (s. 13.4.1)
}

然后下面的驱动展示了显式接口(interface)方法实现的效果。

public static void Main()
{
A a = new A();
a.Bar(); // prints A.Bar
(a as IFoo).Bar(); // prints IFoo.Bar
(a as IBaz).Bar(); // prints IBaz.Bar
(a as IQux).Bar(); // prints IBaz.Bar
}

关于c# - 如何通过保留方法名称来扩展接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8963542/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com