C#:仅使用接口及其实现的实例来模拟继承 - 是否可能?

时间:2010-01-27 12:26:01

标签: c# inheritance interface proxy

我想仅使用接口和基类的实例来模拟基类(无法访问)的派生(而不是直接从基类派生)。

让我试着更好地解释一下:我有一个暴露的接口和一个(隐藏的)类实现。

在另一个模块中,我创建了接口的第二个实现,并从第一个模块传递了一个隐藏类的实例。

我想要第二个实现:

  • 它将接口方法委托给默认实现
  • 它可以覆盖任何接口方法
  • 可以从
  • 派生
  • [棘手的部分]来自调用虚方法的默认实现的代码将调用此类的重写方法或从中派生的类。

请记住,我无法直接从默认实现派生出来!

描述它的最佳方式就是一个例子。

大会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"

3 个答案:

答案 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的实例,然后在您的方法中调用反射对象上的方法。