我有以下课程
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的衍生物
答案 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
课程中处理。