子类重赋值父类字段的简洁代码设计咨询:以银行账户类为例
解决方案
你要的「不可变+子类可自定义值+更简洁的继承逻辑」可以通过抽象只读属性实现。const属于编译期常量,是隐式静态的类级别成员,本身就不支持继承重写,并不适配这个场景。
优化后的代码如下:
public abstract class Account { // 定义抽象只读属性,强制所有子类必须实现 protected abstract string FriendlyName { get; } public string ShowBalance() { var message = new StringBuilder(); message.Append($"Your {FriendlyName} balance is {Balance}") .Append("See you soon!"); return message.ToString(); } // 此处保留你原有代码中已实现的Balance属性 protected decimal Balance { get; set; } } public class SavingsAccount : Account { // 子类仅需重写属性即可,无需额外编写构造函数赋值 protected override string FriendlyName => "savings account"; } public class CurrentAccount : Account { protected override string FriendlyName => "current account"; }
方案优势
- 代码更精简,省去了子类构造函数的字段赋值逻辑
- 天然不可变:属性仅开放get访问器,基类和子类都无法在运行时修改值,完全符合你想要的类const效果
- 安全性更高:抽象属性强制所有非抽象子类必须实现FriendlyName,不会出现漏赋值导致字段为空的问题
- 扩展性好:如果后续需要给FriendlyName增加逻辑(比如多语言翻译),仅需要修改对应子类的属性实现即可,不需要改动基类逻辑
内容的提问来源于stack exchange,提问作者Larry
相关产品推荐
相关产品推荐

