覆盖重载C#

时间:2019-03-21 02:49:21

标签: c# override overloading chain-of-responsibility

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

例如,我有一个方法有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。如果我想要两个以上的重载,它将变得更难看

谢谢!

1 个答案:

答案 0 :(得分:-1)

由于我有许多同名的可重写方法,因此我创建了一个小模式来跟踪使用的重写(在base.MyMethod()中。 然后,用户可以调用任何重载,应用程序将循环遍历所有重载,直到看到有人将其“已执行”标志设置为true。然后执行“真实基础方法”并中断循环。我猜这种模式可以描述为“入口点不明确的单次覆盖的链式重载”