【发布时间】:2011-01-09 22:42:40
【问题描述】:
我想仅使用接口和基类的实例来模拟从基类(不可访问)派生(而不是直接从基类派生)。
让我试着更好地解释一下:我有一个公开的接口和一个(隐藏的)类实现。
在另一个模块中,我创建了接口的第二个实现,并将第一个模块的隐藏类的实例传递给它。
我希望第二个实现做什么:
- 它将接口方法委托给默认实现
- 它可以覆盖任何接口方法
- 它可以派生自
- [棘手的部分] 默认实现中调用虚方法的代码将调用此类或从它派生的类的重写方法。
记住,我不能直接从默认实现派生!
最好的描述方式是一个例子。
大会 A:
internal class DefaultImpl: IMyInterface {
public virtual void MyMethod(){
//call a virtual method vvvv
Console.WriteLine(this.GetString());
}
public virtual string GetString(){
return "default implementation";
}
}
public Interface IMyInterface {
void MyMethod();
string GetString();
}
------
大会 B:
class BaseExtraImpl: IMyInterface {
public BaseExtraImpl(IMyInterface i_implementation){
/* magic happens here */
}
public virtual void MyMethod(){ /*delegate to implementation*/ }
public virtual string GetString(){ /*delegate to implementation*/ }
}
class ExtraImpl: BaseExtraImpl{
public ExtraImpl(IMyInterface i_implementation): base(implementation) {}
public override string GetString(){
return "extra implementation";
}
}
用法:
DefaultImpl def;
// ^^^ this is initialized to an instance of DefaultImpl;
// it doesn't matter how.
ExtraImpl extra = new ExtraImpl(def);
extra.MyMethod(); //should print "extra implementation"
【问题讨论】:
-
是否有充分的理由说明您的基类在交付时无法继承它?
-
只有一个:它不在我的控制之下:(
标签: c# inheritance interface proxy