是两次实现一个显式接口来实现"虚拟"行为丑陋的黑客行为?

InB*_*een 6 c#

好的,这来自于此处的一些讨论.

想象一下以下场景.公司Alpha发布了库Charlie,其中暴露了一个显式Charlie.Bar实现接口的类型IFooable:

 public interface IFooable
 {
     void Foo();
 }

 namespace Charlie
 {
     public clas Bar: IFooable
     {
         void IFooable.Foo() {...}
         ....
     }
 }
Run Code Online (Sandbox Code Playgroud)

现在它发生公司贝塔是继承Charlie.Bar在库Tango一些非常特殊的功能,其中明确落实IFooable.Foo不剪.Beta需要"覆盖"接口实现并实现看似等效的虚拟行为; 调用IFooable.Foo()应该正确解析对象的运行时类型.请注意,让公司Alpha修改实施Charlie.Bar不是一个可行的选择.

那么怎么做呢?显式接口方法在CIL中标记为virtual,final因此您不能覆盖它们.Beta提出了这个"黑客":

using Charlie;

namespace Tango
{
     class Blah: Bar, IFooable
     {
         void IFooable.Foo() { //Bar specific implementation }
     }
}
Run Code Online (Sandbox Code Playgroud)

请注意IFooable再次执行,Blah即使它是多余的.使用此代码,您实际上在调用时获得与虚方法相同的行为IFooable.Foo():

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

 fooBlah.Foo() // Blah's implementation is called.
 fooBar.Foo() // Bar's implementation is called.
Run Code Online (Sandbox Code Playgroud)

这是一个非常难看的黑客?(我已经看到它在类似的合理情况下完成了).有什么替代方案?

Ily*_*lin -1

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

如果我发现接口重新实现是我控制 Bar 和 Blah 的代码库中某些设计问题的解决方案,我会认为这是设计过于复杂。