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

时间:2011-12-10 13:11:05

标签: c# class inheritance reference override

我有以下课程

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的衍生物

3 个答案:

答案 0 :(得分:3)

您不能强制从外部对类进行方法更改。当(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();
        }
    }
}

答案 1 :(得分:2)

听起来你需要使用装饰器模式:类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
  }
}

答案 2 :(得分:0)

你不能轻易做到这一点。

相反,您应该设计classB以获得可扩展性,例如将事件添加到classB,您可以在SUPER课程中处理。