【问题标题】:C#: Simulate inheritance using just an interface and an instance of its implementation - is it possible?C#:仅使用接口及其实现的实例来模拟继承 - 可能吗?
【发布时间】: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


【解决方案1】:

嗯,这将始终输出"default implementation"。我看到的唯一选择是实现您自己的IMyInterface 版本,也许可以从DefaultImpl 复制代码(如果允许的话),但我认为这确实是您避免做的事情。

【讨论】:

  • 是的,这正是我想要避免的 :)
【解决方案2】:

你可以看到之前的帖子How To Access Internal Class from External Assembly

但是,它的要点是,您可以将“InternalsVisibleTo”程序集属性应用于程序集 A,以便程序集 B 可以查看和访问默认实现,但这只有在您控制两个程序集的源代码时才有效。否则,您需要使用反射在程序集 B 中创建 Default 的实例,然后在您的方法中调用反射对象上的方法。

【讨论】:

  • 我有不能从 B 引用 A 的约束(我必须忍受它)。但是,我可以很容易地获得程序集 B 中实现的 instance - 无需反射。
【解决方案3】:

您需要的是 c# 中的 mixin 可能性。不幸的是,c# 没有这些。也许你可以在这里找到答案:Is it possible to implement mixins in C#?

【讨论】:

    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-07
    • 1970-01-01
    • 2011-02-17
    • 2011-04-29
    • 2016-10-23
    相关资源
    最近更新 更多