gpt4 book ai didi

c# - C#中类的显式接口(interface)实现

转载 作者:行者123 更新时间:2023-11-30 15:43:43 28 4
gpt4 key购买 nike

在 C# 中是否有类似于显式接口(interface)实现但用于类的东西?

考虑以下情况:

X 公司提供了一个包含如下类的库:

public class LibraryClass
{
public virtual void A() { }

public void DoWork()
{
// does something
}
}

Y 公司在其产品之一中使用此库并继承自 LibraryClass:

public class UserClass : LibraryClass
{
public virtual void B() { }
}

目前一切正常。但是有一天 X 发布了一个新的库版本并添加了一个虚方法 B()LibraryClass:

public class LibraryClass
{
public virtual void A() { }
public virtual void B() { }

public void DoWork()
{
// does something
// now uses B with certain semantic assumptions
}
}

现在 Y 更新到新的库版本。在使用对新版本的引用进行编译时,编译器会发出一条警告,指出 UserClass.B() 正在隐藏继承的方法 LibraryClass.B(),因此应该指定 new 关键字或覆盖该方法。因为现有方法 UserClass.B() 和新引入的方法 LibraryClass.B() 之间存在语义鸿沟 Y 决定引入 code> 关键字,因为 UserClass.B() 的任何现有覆盖可能不会提供 DoWork() 预期的语义,这会破坏代码。另一方面,Y 想要使用库的一项新功能,这需要重写 LibraryClass.B()。现在这是不可能的:如果覆盖将在 UserClass 的派生类中完成,由于 new<,覆盖将引用 UserClass.B()/关键字;甚至不允许在 UserClass 中覆盖 B 本身,因为它已经定义了具有该签名的公共(public)方法。

如果 UserClass 的派生类中有一种方法可以指定覆盖引用 LibraryClass.B() ,那么这种情况就可以解决,这是不可能的据我所知 - 或者 - 如果 B() 可以在 UserClass 中显式覆盖:

public class UserClass : LibraryClass
{
...

// Override this method in order to change the behavior of LibraryClass.B()
public virtual void LibraryB() { }

private void override LibraryClass.B()
{
LibraryB();
}

...
}

除了重命名 UserClass 中的原始 B() 之外,语言中是否有任何方法可以解决这种情况(如果它是Z公司使用的图书馆本身)?如果不是,这是 C# 的限制还是 CLR 的限制?

很抱歉这篇文章很长,感谢您阅读到这里。

编辑:这不是 CLR 限制。 C++/CLI 支持解决这种情况的命名覆盖,因此您可以执行类似 virtual void LibraryB(void) = LibraryClass::B; 的操作。 C# 设计团队可能只是错过了这个问题。

最佳答案

Is there any way in the language to solve this situation other than...

不,没有。如果您真的觉得这是一个风险,也许使用基于接口(interface)的设计而不是继承。就个人而言,我觉得这不太可能给您带来任何重大问题,尤其是当您使用比 B() 更具体的方法名称时。

关于c# - C#中类的显式接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6552436/

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