[英]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.