继承类集的C#编码 - 使用关键字'base.methodname和this.methodname'是一个好习惯吗?

时间:2012-02-07 11:36:46

标签: c# class inheritance this base

我已经在C#工作了很长一段时间,但偶尔和同事一起讨论这个长期存在的问题。

问题是:在一个继承的类集中 - 当调用一个方法时,我们应该使用关键字'base.methodname和this.methodname'......而不管它是否是一个被重写的方法?

我的回答是:是的 - 这是一个很好的做法 - 使用它,因为这就是为什么创造它们的原因。

详细解释:此外,代码可能会在逻辑方面发生变化,也许某些类似IF-ELSE的条件可能会在以后出现。所以在那个时候,开发人员必须被迫重新访问每行代码并确保他/她正确选择调用哪个方法--- base.methodname()或this.methodname()ELSE。 .NET框架将调用DEFAULT(我认为它的base.methodname())并且整个逻辑可以进行折腾。

其他C#程序员对此有何看法?

4 个答案:

答案 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只是因为它是将被调用的基类中的实现。 意味着说“我知道实际的实现是在基类中”,这是一种说“特别的方式在这个类中调用实现,调用基类“。以任何其他方式使用它会部分地破坏继承点。