覆盖重载 C#
Overriding overloads C#
好的,所以我已经解决了这个问题,但我想ask/share你们的想法。
我有一个基础 class,其中一个方法有 2 个重载,例如
public class Entity{
public virtual bool Save() {
//ReallySave()...
}
public virtual int Save(string someParam){
//also ReallySave()...
}
}
我有一个派生的 class,我想在其中重写任何我想重写的 save() 方法,例如
class Person {
override int Save(string someParam){
console.log(someParam)
base.Save(someParam);
}
}
现在的问题是,在别的地方,我想打电话给
person.Save();
或
person.Save("hello");
但我无法知道(我也不应该)哪个重载被覆盖了。这段代码由于结合了可覆盖的重载方法而失败,因为调用 save() 不会进入覆盖的方法。
所以我做了一些小技巧来确保在基本级别,每个基本方法都调用另一个,类似于 "chain of responsability" 模式。
修改后的基数 class 的一个例子是
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
}
}
现在的问题是:
有一个更好的方法吗?该代码有效,但
一个。它很臭
b。如果我想要超过 2 个重载,它会变得更丑
谢谢!
由于我有许多同名的可覆盖方法,我创建了一个小模式来跟踪使用了哪个覆盖(在 base.MyMethod().
然后,用户可以调用任何重载,应用程序将循环所有重载,直到它看到有人将其 "executed" 标志设置为 true。然后执行 "real base method" 并打破循环。我想这个模式可以描述为 "chained overloads for single override with indistinct entry point"
好的,所以我已经解决了这个问题,但我想ask/share你们的想法。
我有一个基础 class,其中一个方法有 2 个重载,例如
public class Entity{
public virtual bool Save() {
//ReallySave()...
}
public virtual int Save(string someParam){
//also ReallySave()...
}
}
我有一个派生的 class,我想在其中重写任何我想重写的 save() 方法,例如
class Person {
override int Save(string someParam){
console.log(someParam)
base.Save(someParam);
}
}
现在的问题是,在别的地方,我想打电话给
person.Save();
或
person.Save("hello");
但我无法知道(我也不应该)哪个重载被覆盖了。这段代码由于结合了可覆盖的重载方法而失败,因为调用 save() 不会进入覆盖的方法。
所以我做了一些小技巧来确保在基本级别,每个基本方法都调用另一个,类似于 "chain of responsability" 模式。
修改后的基数 class 的一个例子是
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
}
}
现在的问题是: 有一个更好的方法吗?该代码有效,但
一个。它很臭
b。如果我想要超过 2 个重载,它会变得更丑
谢谢!
由于我有许多同名的可覆盖方法,我创建了一个小模式来跟踪使用了哪个覆盖(在 base.MyMethod(). 然后,用户可以调用任何重载,应用程序将循环所有重载,直到它看到有人将其 "executed" 标志设置为 true。然后执行 "real base method" 并打破循环。我想这个模式可以描述为 "chained overloads for single override with indistinct entry point"