我注意到当使用Visual Studio在C#中覆盖虚拟方法时,IDE会自动添加base.Method()调用。另一方面,当重写抽象方法时,IDE会自动添加NotImplementedException()。
为什么VS在覆盖虚拟方法时会自动添加base.Method()调用?调用基本方法是最佳做法吗?
答案 0 :(得分:7)
这取决于您是否仍需要发生基本行为。该决定将根据具体情况作出。虽然有些模式可能会调用基本方法(IDisposable pattern的正确实现以这种方式工作),但是没有硬性规则和快速规则。
答案 1 :(得分:4)
Visual Studio自动生成基类调用。您可以选择是否适合呼叫基地,这取决于您覆盖的原因。
答案 2 :(得分:0)
如果你完全覆盖了有问题的方法,可能会认为你没有遵循Liskov替代原则的风险更高。但是没有一般规则要遵循。
答案 3 :(得分:0)
抽象方法基本上是一个空方法。 IDE添加未实现的异常以通知该方法尚未实现,并且它不能委托给基类,因为它甚至没有实现。 对于虚方法,IDE作为默认方法将调用该方法的基类实现,因为它至少会有一个实现(您可能会覆盖)
答案 4 :(得分:0)
这完全取决于你需要做什么。通常,您需要在“子”方法中包含“基本”方法行为,这就是为什么VS有助于添加语法来执行此操作。但是,在所有情况下都不一定如此。
另一方面,实现抽象方法意味着没有“基本”方法可以调用(毕竟,它是抽象的!),所以最好的VS可以做的只是“标记”方法未实现。
答案 5 :(得分:0)
考虑使用te VS代码生成器的情况,但稍后忘记(或决定不)填充方法体。
如果你要覆盖virtual
方法,如果你不想以任何方式改变行为,那么合理的做法就是保留旧的 - 这就是base
打电话。
另一方面,当您override
abstract
方法时,您没有任何base
可供参考 - 抽象方法根据定义没有实体。
因此,如果您未能在覆盖中提供新实现,则始终是错误。 NotImplemented
例外会引起您的注意。
有些模式需要您调用方法(例如IDisposable
或某些模板方法)。在其他情况下,总是需要提供新的实现,因此它取决于场景。
答案 6 :(得分:0)
调用基本方法取决于您想要做的事情:
例如,如果重写控件的OnInit方法,则默认情况下,如果不调用基本方法,则不会引发事件“Init”。如果你想完全改变方法行为,你不应该调用基本方法。例如,StringBuilder类的重写方法ToString()有自己的实现,而且从不调用基类的ToString(对象)
我认为Visual studio提出了基本调用,因为没有其他修改,所有仍然工作(基础bheaviuor没有改变) 必须实现抽象方法,抛出异常作为默认语句应该可以帮助你重新正确实现
答案 7 :(得分:-3)
添加这样的调用不会修改方法行为。