C# 重写重载#

C# 重写重载#,c#,overriding,overloading,chain-of-responsibility,C#,Overriding,Overloading,Chain Of Responsibility,好的,我已经解决了这个问题,但我想问/分享你们的想法 例如,对于一个方法,我有一个带有2个重载的基类 public class Entity{ public virtual bool Save() { //ReallySave()... } public virtual int Save(string someParam){ //also ReallySave()... } } class Person { over

好的,我已经解决了这个问题,但我想问/分享你们的想法

例如,对于一个方法,我有一个带有2个重载的基类

public class Entity{
    public virtual bool Save() {
          //ReallySave()...
    }

    public virtual int Save(string someParam){
       //also ReallySave()...
    }
}
class Person {
     override int Save(string someParam){
           console.log(someParam)
           base.Save(someParam);
     }
}
我有一个派生类,我想在其中重写我想重写的save()方法

public class Entity{
    public virtual bool Save() {
          //ReallySave()...
    }

    public virtual int Save(string someParam){
       //also ReallySave()...
    }
}
class Person {
     override int Save(string someParam){
           console.log(someParam)
           base.Save(someParam);
     }
}
现在的问题是,在别的地方,我想打电话

person.Save();

但我无法知道(也不应该知道)哪个重载被覆盖。此代码由于其可重写重载方法的组合而失效,因为调用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。如果我想要两个以上的重载,它会变得更难看


谢谢

因为我有许多具有相同名称的可重写方法,所以我创建了一个小模式来跟踪使用了哪个重写(在base.MyMethod()中)。
然后,用户可以调用任何重载,应用程序将在所有重载中循环,直到看到有人将其“executed”标志设置为true。然后执行“real base method”并打破循环。我猜这种模式可以被描述为“具有模糊入口点的单次重写的链式重载”

如果有一个带有可选参数的方法呢?或者在基础中有一个通用的私有方法,然后你就可以去掉布尔值了?可选参数的问题是(在现实生活中),这些调用在参数方面确实不同,在返回类型上也不同!所以不仅仅是有“更多选项”。其次,公共私有方法ReallySave()确实存在,但仍然无法帮助确保调用派生类重写。您是否抱怨person.Save(字符串)调用entity.Save(),即使person重写Save()?您在person.Save(字符串)中执行了state base.Save();运行时只是按照要求执行,不是吗?或者您是否希望通过base.Save()在person上显式引用entity.Save(),会遵循“trying entity.Save()…噢,它被重写了,我将在person.Save()中调用重写的版本”?我是说,安装“person”对象会公开Save()和Save(字符串)并且任何一个都可以被亲自重写。您希望确保无论您在使用此模式数月后调用Save()[not implemented]还是Save(“”[implemented]),都会调用已实现的一个。我必须说,它完成了任务