我已经在C#工作了很长一段时间,但偶尔和同事一起讨论这个长期存在的问题。
问题是:在一个继承的类集中 - 当调用一个方法时,我们应该使用关键字'base.methodname和this.methodname'......而不管它是否是一个被重写的方法?
我的回答是:是的 - 这是一个很好的做法 - 使用它,因为这就是为什么创造它们的原因。
详细解释:此外,代码可能会在逻辑方面发生变化,也许某些类似IF-ELSE的条件可能会在以后出现。所以在那个时候,开发人员必须被迫重新访问每行代码并确保他/她正确选择调用哪个方法--- base.methodname()或this.methodname()ELSE。 .NET框架将调用DEFAULT(我认为它的base.methodname())并且整个逻辑可以进行折腾。
其他C#程序员对此有何看法?
答案 0 :(得分:0)
如果您确定始终在基类中使用该方法,则可以使用base.MyMethod。 但要注意这一点:
想象一下,你在基类中有一个名为“GetPrice”的方法,并且你开始在你的继承类(PromoClass)上使用base.GetPrice。 3个月后,有人要求改变促销(PromoClass)中计算价格的方式,您(或新开发者)将覆盖或新建方法并测试它...等待,不工作:|。因为您总是在基类中调用该方法。所以它仍然会在base中调用该方法,你需要更改类中的所有调用。
这是一个当然的例子。如果这是你公司的标准,那么每个人都应该知道他应该改变整个班级的方法,如果没有,请小心。
我更喜欢使用“base”。使用基本方法,但我通常忽略“这个”。
答案 1 :(得分:0)
我觉得如果你以任何方式怀疑你是在调用类或基类中的方法,它都会像糟糕的类设计一样。
我很难找到任何可以证明显式调用重写的基类方法的好例子,期望从派生类或第三方类派生。
我个人从不使用虚拟方法。您几乎总能使用接口和抽象方法进行更好的设计。
使用基本调用时,这是因为您希望扩展基本方法的功能,因此您可以在重写方法中调用基本方法。在我看来,任何其他基础用法在各方面都是错误的。此外,在覆盖虚拟方法和调用base之前,您应该考虑是否可以以其他方式实现扩展。例如,如果您的基本方法称为抽象方法或接口方法,您可以在派生类中实现或注入。
我使用虚拟方法的几次是在通用基类中留下“空白”方法。空白方法(如线程封装中的InitializeThread())允许我可选地扩展基类,但我绝不会在基本方法中编写代码而永远不会调用base。
调用基地是错误的!
答案 2 :(得分:0)
我同意@Holstebroe和@Bruno Costa。当你每次显式调用base.Method时,你实际上是在切断多态性的可能性,这是首先使用继承的基本原因之一。
答案 3 :(得分:0)
你是否使用“这个”。是一个意见问题。有些人喜欢它,因为很明显你在调用某种类级别,其他人则觉得它是多余的噪音。
至于基础 - 在我看来,你应该只明确说“基础”。如果要显式调用基本方法而不是当前类中的重写方法。通常,你应该看到它的唯一地方就是被覆盖的方法本身。
不要调用base只是因为它是将被调用的基类中的实现。 不意味着说“我知道实际的实现是在基类中”,这是一种说“特别不的方式在这个类中调用实现,调用基类“。以任何其他方式使用它会部分地破坏继承点。