覆盖重载 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"