C#多级继承场景下Cheque子类构造函数跳转至Ahorro父类问题求解
问题原因
- C#实例化派生类时,默认会优先执行父类的无参构造函数,你的
Ahorro类无参构造函数内部包含了死循环交互菜单逻辑,只要用户不选择退出或返回主菜单,代码会一直卡在Ahorro的构造执行流程中,永远不会走到Cheque构造函数的内容。 - 额外逻辑错误:Cheque类的
Depositar/Retirar/VerBalance方法都新建了独立的Ahorro实例,操作的不是当前Cheque对象继承来的属性,既没有复用父类逻辑,也会出现数据不同步的问题。
解决方案
1. 拆分父类构造函数的业务逻辑
把Ahorro类的交互菜单逻辑从构造函数中抽离成独立方法,构造函数仅做基础属性初始化:
// 修改Ahorro类构造,移除所有交互、循环逻辑 public Ahorro() { // 仅保留必要的属性初始化代码即可 } // 新增独立的菜单方法,用virtual关键字方便子类重写 public virtual void MostrarMenu() { // 把原来写在Ahorro构造里的所有交互、循环代码全部迁移到此处 int opc = 0; Console.WriteLine("Entre numero de la cuenta"); Numero = Console.ReadLine(); Console.WriteLine("Entre el deposito inicial"); depositoInicial = Convert.ToDouble(Console.ReadLine()); // 剩余原有菜单逻辑直接照搬即可 }
2. 调整Cheque类逻辑
显式指定调用父类空构造,重写菜单方法,修正父类逻辑复用方式:
public class Cheque: Ahorro { double depositoInicial; string[] args; // 显式调用父类空构造,不会触发原有父类菜单逻辑 public Cheque() : base() { } // 重写父类菜单方法,放置Cheque专属交互逻辑 public override void MostrarMenu() { // 把原来写在Cheque构造里的所有交互、循环代码全部迁移到此处 int opc = 0; Console.WriteLine("Entre numero de la cuenta"); Numero = Console.ReadLine(); Console.WriteLine("Entre el deposito inicial"); depositoInicial = Convert.ToDouble(Console.ReadLine()); // 剩余原有Cheque菜单逻辑直接照搬即可 } // 修正方法复用逻辑,不要新建Ahorro实例,直接调用父类同名方法操作当前对象属性 public double Depositar(double deposito) { base.Depositar(deposito); return 0; } public string Retirar(double retiro) { base.Retirar(retiro); return ""; } public void VerBalance() { base.VerBalance(); } }
3. 调整实例化调用逻辑
实例化Cheque对象后主动调用菜单方法触发交互即可:
Cheque miCuentaCheque = new Cheque(); miCuentaCheque.MostrarMenu();
内容的提问来源于stack exchange,提问作者Felipe Xavier Diaz
相关产品推荐
相关产品推荐

