gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 15:05:58 26 4
gpt4 key购买 nike

我有以下类(class)

public class classB : classA 

其中包含函数 dostuff

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

classB SUPER_B;

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

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

如果有一种方法可以检索 B 的“dostuff”的引用,那将是有道理的,但我不知道如何实现。

我研究过 virtual 和 Func,但它们似乎要求 SUPER 是 B 的派生

最佳答案

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

示例 #1 - 可设置委托(delegate):

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)。

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();
}
}
}

关于c# - 覆盖非派生 c# 类中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8456713/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com