我想仅使用接口和基类的实例来模拟基类(无法访问)的派生(而不是直接从基类派生)。
让我试着更好地解释一下:我有一个暴露的接口和一个(隐藏的)类实现。
在另一个模块中,我创建了接口的第二个实现,并从第一个模块传递了一个隐藏类的实例。
我想要第二个实现:
请记住,我无法直接从默认实现派生出来!
描述它的最佳方式就是一个例子。
大会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"
答案 0 :(得分:2)
你需要的是c#中的mixin可能性。不幸的是,c#没有那些。也许你可以在这里找到答案:Is it possible to implement mixins in C#?
答案 1 :(得分:0)
嗯,这总是输出"default implementation"
。我看到的唯一选择是实现您自己的IMyInterface
版本,可能会复制DefaultImpl
中的代码(如果您被允许),但我认为这就是您要避免做的事情。
答案 2 :(得分:0)
您可以看到上一篇文章How To Access Internal Class from External Assembly。
但是,它的要点是您可以将“InternalsVisibleTo”程序集属性应用于程序集A,以便程序集B可以查看和访问Default实现,但这仅在您控制两个程序集的源代码时才有效。否则,您需要使用反射在程序集B中创建Default的实例,然后在您的方法中调用反射对象上的方法。