Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#:仅使用一个接口及其实现的实例来模拟继承-可能吗?_C#_Inheritance_Interface_Proxy - Fatal编程技术网

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

C#:仅使用一个接口及其实现的实例来模拟继承-可能吗?,c#,inheritance,interface,proxy,C#,Inheritance,Interface,Proxy,我想只使用基类的接口和实例(而不是直接从基类派生)来模拟从基类派生(这是不可访问的) 让我试着更好地解释一下:我有一个公开的接口和一个(隐藏的)类实现 在另一个模块中,我创建了接口的第二个实现,并将第一个模块中隐藏类的实例传递给它 我希望第二个实现执行的操作: 它将接口方法委托给默认实现 它可以覆盖任何接口方法 它可以从 [棘手的部分]来自调用虚拟方法的默认实现的代码将调用该类或从该类派生的类的重写方法 记住,我不能直接从默认实现派生 最好用一个例子来描述它 大会A: internal cl

我想只使用基类的接口和实例(而不是直接从基类派生)来模拟从基类派生(这是不可访问的)

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

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

我希望第二个实现执行的操作:

  • 它将接口方法委托给默认实现
  • 它可以覆盖任何接口方法
  • 它可以从
  • [棘手的部分]来自调用虚拟方法的默认实现的代码将调用该类或从该类派生的类的重写方法
记住,我不能直接从默认实现派生

最好用一个例子来描述它

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

哼,这将始终输出
“默认实现”
。我看到的唯一选择是实现您自己版本的
IMyInterface
,可能是从
DefaultImpl
复制代码(如果允许的话),但我认为这确实是您要做的。

您可以看到前面的文章


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

您需要的是在c#中混入可能性。不幸的是,c#没有这些。也许你可以在这里找到答案:

是的,这正是我试图避免的:)是否有一个很好的理由可以解释为什么你的基类没有从它继承的能力?只有一个:它不在我的控制之下:(我有不能从B引用a的限制(我不得不接受它).然而,我可以很容易地在程序集B中获得实现的实例-无需进行反射。