gpt4 book ai didi

C#接口(interface)方法歧义

转载 作者:IT王子 更新时间:2023-10-29 04:10:39 26 4
gpt4 key购买 nike

考虑以下示例:

interface IBase1
{
int Percentage { get; set; }
}

interface IBase2
{
int Percentage { get; set; }
}

interface IAllYourBase : IBase1, IBase2
{
}

class AllYourBase : IAllYourBase
{
int percentage;

int Percentage {
get { return percentage; }
set { percentage = value; }
}
}

void Foo()
{
IAllYourBase iayb = new AllYourBase();
int percentage = iayb.Percentage; // Fails to compile. Ambiguity between 'Percentage' property.
}

在上面的示例中,在调用哪个 Percentage 属性之间存在歧义。假设 IBase1IBase2 接口(interface)可以改变,我将如何以最干净、最优选的方式解决这种歧义?

更新

基于我使用显式接口(interface)实现得到的响应,我想提一下,虽然这确实解决了问题,但它并没有以理想的方式解决它,因为我使用了我的 AllYourBase大多数时候作为 IAllYourBase 对象,从不作为 IBase1IBase2。这主要是因为 IAllYourBase 也有由 AllYourBase 实现的接口(interface)方法(我没有在上面的代码片段中详细说明这些方法,因为我认为它们不相关),我想也可以访问那些。一直来回转换会变得非常乏味并导致代码困惑。

我确实尝试了一种解决方案,该解决方案涉及在 IAllYourBase 中定义 Percentage 属性并且不使用显式接口(interface)实现,这似乎至少消除了编译器错误:

class IAllYourBase : IBase1, IBase2
{
int Percentage { get; set; }
}

这是一个有效的解决方案吗?

最佳答案

明确实现:

public class AllYourBase : IBase1, IBase2
{
int IBase1.Percentage { get{ return 12; } }
int IBase2.Percentage { get{ return 34; } }
}

如果你这样做,你当然可以像平常一样对待你的无歧义属性。

IAllYourBase ab = new AllYourBase();
ab.SomeValue = 1234;

但是,如果你想访问 percentage 属性,这将不起作用(假设它起作用了,期望返回哪个值?)

int percent = ab.Percentage; // Will not work.

您需要指定要返回的百分比。这是通过转换到正确的接口(interface)来完成的:

int b1Percent = ((IBase1)ab).Percentage;

如你所说,你可以重新定义界面中的属性:

interface IAllYourBase : IBase1, IBase2
{
int B1Percentage{ get; }
int B2Percentage{ get; }
}

class AllYourBase : IAllYourBase
{
public int B1Percentage{ get{ return 12; } }
public int B2Percentage{ get{ return 34; } }
IBase1.Percentage { get { return B1Percentage; } }
IBase2.Percentage { get { return B2Percentage; } }
}

现在您已经通过不同的名称解决了歧义。

关于C#接口(interface)方法歧义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7080861/

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