好,所以我已经解决了这个问题,但是我想问/分享你们的想法。
例如,我有一个方法有2个重载的基类
public class Entity{
public virtual bool Save() {
//ReallySave()...
}
public virtual int Save(string someParam){
//also ReallySave()...
}
}
并且我有一个派生类,例如,我想重写我想重写的任何save()方法
class Person {
override int Save(string someParam){
console.log(someParam)
base.Save(someParam);
}
}
现在问题出在其他地方,我想打电话给
person.Save();
或
person.Save("hello");
但是我无法(也不应该)知道哪个过载被覆盖。该代码归因于其可重写的重载方法的组合,因为调用save()不会进入重写的方法。
因此,我做了一些技巧,以确保在基本级别上,每个基本方法都调用另一个方法,类似于“责任链”模式。
修改后的基类的示例为
public class Entity{
private bool WithParamsMethodCalled = false;
private bool NoParamsMethodCalled = false;
public virtual bool Save() {
NoParamsMethodCalled = true;
if(!WithParamsMethodCalled ) { Save(""); }
//ReallySave()...
}
public virtual int Save(string someParam){
WithParamsMethodCalled = true;
if(!NoParamsMethodCalled ) { Save(); }
///no need to call ReallySave() here
}
}
现在的问题是: 有一个更好的方法吗?该代码有效,但
a。臭和
b。如果我想要两个以上的重载,它将变得更难看
谢谢!
答案 0 :(得分:-1)
由于我有许多同名的可重写方法,因此我创建了一个小模式来跟踪使用的重写(在base.MyMethod()中。 然后,用户可以调用任何重载,应用程序将循环遍历所有重载,直到看到有人将其“已执行”标志设置为true。然后执行“真实基础方法”并中断循环。我猜这种模式可以描述为“入口点不明确的单次覆盖的链式重载”