C#为继承的类集编码——使用关键字';base.methodname和this.methodname';
本文关键字:methodname base this 关键字 继承 编码 | 更新日期: 2023-09-27 18:22:46
我在C#工作了很长一段时间,但偶尔会和同事们一起解决这个长期存在的问题。
问题是:在继承的类集中——调用方法时,我们是否应该使用关键字"base.methodname和this.methodname"……而不管它是否是重写的方法?
我的回答是:是的——这是一个很好的实践——使用它,因为这就是为什么这些都是为之创建的。
详细解释:此外,代码可能会在逻辑上发生变化,也许稍后会出现一些类似IF-ELSE的情况。因此,到那时,开发人员必须重新访问每一行代码,并确保他/她正确选择要调用的方法--base.methodname()或this.methodname()否则,.NET框架将调用DEFAULT(我认为它的base.method name()),整个逻辑可能会发生变化。
其他C#程序员对此有何看法?
是否使用"this."是一个意见问题。有些人喜欢它,因为很明显你在称某个级别的东西,而另一些人则觉得这是多余的噪音。
至于base,在我看来,如果你想显式调用base方法,而不是当前类中的重写方法,你只应该显式地说"base."。通常情况下,您甚至应该在重写的方法本身中看到它。
不要因为基类中的实现将被调用就调用base。不是的意思是说"我知道实际实现在基类中",而是说"特别是不要调用这个类中的实现,调用基类"。以任何其他方式使用它在一定程度上违背了继承的意义。
如果您确信您将始终使用基类中的方法,则可以使用base。MyMethod。但要注意这一点:
假设您在基类中有一个名为"GetPrice"的方法,然后开始使用base。GetPrice遍布您继承的类(PromoClass)。3个月后,有人要求更改Promotions(PromoClass)中的价格计算方式,您(或新开发人员)将覆盖或新建该方法并进行测试…等等,不要工作:|。因为您总是在调用基类中的方法。因此,它仍然会调用基类中的方法,并且您需要更改类中的所有调用。
这当然是一个例子。如果这是贵公司的标准,每个人都应该知道,他应该在整个类中更改该方法的调用,如果不是,请小心。
我更喜欢使用"base."来使用base方法,但我通常会忽略"this."。
我同意@Holstebroe和@Bruno Costa的观点。当您显式调用base时。方法,每次都有效地切断了多态性的可能性,这也是首先使用继承的基本原因之一。
如果您以任何方式怀疑您是在类中还是在基类中调用方法,我认为这闻起来像是糟糕的类设计。
我很难找到任何好的例子来证明显式调用重写的基类方法是合理的,如果是从遗留类或第三方类派生的话。
就我个人而言,我几乎从不使用虚拟方法。使用接口和抽象方法几乎总是可以做出更好的设计。
当使用基调用时,是因为您希望扩展基方法的功能,所以您在重写方法中调用基方法。在我看来,基地的任何其他用法在各个方面都是错误的。此外,在重写虚拟方法和调用base之前,您应该考虑是否可以以其他方式实现扩展。例如,如果您的基方法调用了一个抽象方法或接口方法,则可以在派生类中实现或注入该方法。
我使用虚拟方法的少数几次是在通用基类中留下"空白"方法。空白方法(如线程封装中的InitializeThread())允许我选择性地扩展基类,但我永远不会在基方法中编写代码,也永远不会调用基。
呼叫基地是错误的!