C#继承方法调用:是否需用base或this?最佳调用方式探讨(附示例)
在C#中继承方法调用:base vs this的那些事儿
嘿,这个问题问到点子上了,我给你拆解清楚:
一、是否必须使用base或this?
答案是不一定,分两种情况看:
- 如果子类没有重写父类的方法,那调用这个继承来的方法时,写方法名、
this.方法名、base.方法名这三种方式效果完全一致——编译器都会自动找到父类的实现。 - 但如果子类重写了父类的虚方法/抽象方法,那区别就大了:
- 直接写方法名或者用
this.,调用的是子类自己重写后的版本; - 要是想调用父类原本的方法逻辑,那必须用
base.,不然编译器默认会调用子类的重写版本,达不到你要的效果。
- 直接写方法名或者用
二、最佳调用方式是什么?
得根据你的调用意图来选:
- 当你需要复用父类的方法逻辑(比如在子类重写的方法里先执行父类的逻辑,再加自己的逻辑),那必须用base.,这是唯一能准确调用父类原始实现的方式,没得商量。
- 当子类没重写方法,只是调用继承来的方法:
- 要是代码里没有命名冲突(比如没有和方法名一样的局部变量),直接写方法名就好,简洁清爽;
- 要是怕可读性差,或者有命名冲突,用
this.也没问题,能明确表示这是当前实例的方法; - 绝对不要没事就用
base.,这会让看代码的人疑惑:“是不是子类有重写?为什么特意调用父类的?”平白增加理解成本。
举两个实际例子更清楚
例子1:子类没有重写父类方法
public class Parent { public void ShowMessage() { Console.WriteLine("我是父类的消息"); } } public class Child : Parent { public void Display() { // 三种写法输出完全一样 ShowMessage(); this.ShowMessage(); base.ShowMessage(); } }
例子2:子类重写了父类方法
public class Parent { public virtual void ShowMessage() { Console.WriteLine("我是父类的消息"); } } public class Child : Parent { public override void ShowMessage() { Console.WriteLine("我是子类的消息"); } public void DisplayAllMessages() { ShowMessage(); // 输出"我是子类的消息" this.ShowMessage(); // 和上面一样,调用子类版本 base.ShowMessage(); // 输出"我是父类的消息" } }
内容的提问来源于stack exchange,提问作者Martin Baychev
相关产品推荐
相关产品推荐

