繁体   English   中英

覆盖非派生c#类中的函数

[英]Override function in non derived c# class

我有以下课程

public class classB : classA 

其中包含函数dostuff

现在我有一个SUPER类,它的变量中有一个B实例

classB SUPER_B;

并且在其方法中有'重新定义''dostuff'。 基本上,我需要的是当classB调用'dostuff'时,它不会调用它的内部dostuff,而是调用SUPER的dostuff实现。

基本上,我需要在SUPER的初始化时,将classB的'dostuff'替换为SUPER的dostuff。

如果有一种方法可以检索B的'dostuff'的参考,那有点意义,但我不知道如何实现这一点。

我调查了虚拟和Func,但他们似乎要求SUPER是B的衍生物

您不能从外部强制对类进行方法更改。 当(1)classB以支持替换其方法的方式设计时,有很多方法可以实现这样的功能,例如通过可设置的委托,或者(2)如果classB实现了一个可以实现的接口,则包装classB在里面,并替换一个方法。

示例#1 - 可设置的委托:

class ClassB {
    public Action<int> dostuff {get;set;}
    public ClassB() {
        dostuff = myDoStuff;
    }
    void myDoStuff(int n) {
    }
}

class Program {
    public static void Main() {
        var myB = new ClassB();
        myB.dostuff = myOverride;
    }
    void myOverride(int n) {
    }
}

示例#2 - 接口。

interface IClassB {
    void dostuff(int n);
    void dosomething();
}
class ClassB : IClassB {
    void dostuff(int n) {
    }
    void dosomething() {
    }
}
class Program {
    public static void Main() {
        var bb = new Override(new ClassB());
    }
    class Override : IClassB {
        private readonly IClassB inner;
        public Override(IClassB inner) {
            this.inner = inner;
        }
        void dostuff(int n) {
            // do not call inner.dostuff
        }
        void dosomething() {
            inner.dosomething();
        }
    }
}

听起来你需要使用装饰器模式:类SUPER有一个classB的实例并使用它的方法。 SUPER装饰了classB所有必要方法,并添加了一些新方法。 例如:

public class SUPER {
  private classB SUPER_B = new classB();
  public void foo()  {
     SUPER_B.foo();
  }
  public void bar()  {
     SUPER_B.bar();
  }
  ...
  public void dostuff()
  {
       // don't call SUPER_B.bar(), but write your implementation
  }
}

你不能轻易做到这一点。

相反,您应该设计classB以实现可扩展性,例如将事件添加到您可以在SUPER类中处理的classB

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM