好的,这来自于此处的一些讨论.
想象一下以下场景.公司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 的代码库中某些设计问题的解决方案,我会认为这是设计过于复杂。
| 归档时间: |
|
| 查看次数: |
103 次 |
| 最近记录: |