gpt4 book ai didi

c# - 两次实现一个显式接口(interface)来实现 "virtual"行为是否是一个丑陋的 hack?

转载 作者:太空狗 更新时间:2023-10-29 22:02:05 25 4
gpt4 key购买 nike

好的,这源于正在进行的一些讨论 here .

想象一下以下场景。 Alpha 公司发布了库 Charlie,其中公开了一个类型 Charlie.Bar,它明确实现了接口(interface) IFooable:

 public interface IFooable
{
void Foo();
}

namespace Charlie
{
public clas Bar: IFooable
{
void IFooable.Foo() {...}
....
}
}

现在 Beta 公司正在其库 Tango 中子类化 Charlie.Bar 以实现一些非常特殊的功能,其中显式实现 IFooable.Foo 不会削减它。 Beta 需要“覆盖”接口(interface)实现并实现看似等效的虚拟行为;对 IFooable.Foo() 的调用应正确解析为对象的运行时类型。请注意,让 Alpha 公司修改 Charlie.Bar 的实现不是一个可行的选择。

那么如何做到这一点呢?显式接口(interface)方法在 CIL 中标记为 virtualfinal,因此您无法覆盖它们。 Beta 想出了这个“hack”:

using Charlie;

namespace Tango
{
class Blah: Bar, IFooable
{
void IFooable.Foo() { //Bar specific implementation }
}
}

再次注意 BlahIFooable 的实现,尽管它是多余的。使用此代码,您实际上获得了与调用 IFooable.Foo() 时虚方法相同的行为:

 IFooable fooBar = new Bar();
IFooable fooBlah = new Blah();

fooBlah.Foo() // Blah's implementation is called.
fooBar.Foo() // Bar's implementation is called.

这是一个非常丑陋的 hack 吗? (我已经看到它在类似合理的情况下完成了?场景)。如果有的话,有哪些替代方案?

最佳答案

你问的是意见,对吧?我从事 C# 编程已有 10 年了。是的,这看起来确实像黑客攻击。没那么难看,但如果我碰巧必须编写 Tango 库,我会尝试隔离该代码。

如果我在我控制 Bar 和 Blah 的代码库中发现接口(interface)重新实现作为某些设计问题的解决方案,我会建议它是设计过于复杂。

关于c# - 两次实现一个显式接口(interface)来实现 "virtual"行为是否是一个丑陋的 hack?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25740358/

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