簡體   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