【问题标题】:Overriding overloads C#覆盖重载 C#
【发布时间】:2019-03-21 02:49:21
【问题描述】:

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

例如,我有一个基类,其中一个方法有 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
    }
}

现在的问题: 有一个更好的方法吗?该代码有效,但

一个。它的臭味和

b.如果我想要超过 2 个重载,它会变得更丑

谢谢!

【问题讨论】:

  • 如果有一个带有可选参数的方法呢?或者在基础中有一个通用的私有方法,然后你就可以摆脱你的布尔值?
  • 可选参数的问题是(在现实生活中)这些调用在参数方面确实不同,并且返回类型也不同!所以它不仅仅是拥有“更多选择”。其次,公共私有方法ReallySave() 确实存在,但仍无助于确保调用派生类覆盖
  • 您是否在抱怨 person.Save(string) 调用 entity.Save(),即使 person 覆盖了 Save()?你在 person.Save(string); 中做了状态 base.Save()运行时只是按照它的指示做,不是吗?或者您是否期望通过 base.Save() 在 person 上明确引用 entity.Save() 会遵循“尝试 entity.Save()... .Save() 代替“?
  • 我是说 instaced "person" 对象暴露了 Save() 和 Save(string) 并且任何可以在 Person 中被覆盖。无论您调用 Save() [未实现] 还是 Save("") [已实现],您都希望确保调用已实现的

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


【解决方案1】:

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

【讨论】:

  • 在使用这种模式几个月后,我必须说它完成了工作
猜你喜欢
  • 1970-01-01
  • 2010-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多