如何复用基类构造函数中已传入的计算参数?避免重复计算
解决方案
当然可以避免重复计算,针对你的场景,有几种实用的方案:
方案1:修改基类,暴露传入的age值
如果有权限修改基类A,可以在基类中添加一个protected的Age属性,这样派生类B就能直接复用基类已经接收的age值,无需重复计算:
class A { public string Description { get; } protected int Age { get; } // 添加受保护的Age属性 public A(string type, int age) { Age = age; Description = $"Type: {type}, Age: {age}"; } } class B : A { public int Age { get; } public B(string type, DateTime dateOfBirth, DateTime currentDate) : base(type, CalculateAge(dateOfBirth, currentDate)) { Age = base.Age; // 直接复用基类的Age值 } static int CalculateAge(DateTime dateOfBirth, DateTime currentDate) { return (currentDate.DayOfYear < dateOfBirth.DayOfYear) ? currentDate.Year - dateOfBirth.Year - 1 : currentDate.Year - dateOfBirth.Year; } }
方案2:私有构造函数中转(无需修改基类)
如果不能修改基类,可以通过派生类的私有构造函数来中转计算结果,确保只调用一次计算方法:
class A { public string Description { get; } public A(string type, int age) { Description = $"Type: {type}, Age: {age}"; } } class B : A { public int Age { get; } // 对外公开的构造函数,先计算出age值,再传给私有构造函数 public B(string type, DateTime dateOfBirth, DateTime currentDate) : this(type, CalculateAge(dateOfBirth, currentDate)) { } // 私有构造函数,接收已计算好的age值,同时传给基类和自身属性 private B(string type, int age) : base(type, age) { Age = age; } static int CalculateAge(DateTime dateOfBirth, DateTime currentDate) { return (currentDate.DayOfYear < dateOfBirth.DayOfYear) ? currentDate.Year - dateOfBirth.Year - 1 : currentDate.Year - dateOfBirth.Year; } }
针对引用类型的说明
如果类似CalculateAge的方法返回的是引用类型,重复调用可能生成不同实例(比如每次调用都新建对象),上述两种方案都只调用一次计算方法,把同一个实例同时传给基类和派生类的属性,从根本上避免了重复调用带来的不一致问题。
内容的提问来源于stack exchange,提问作者M Kloster
相关产品推荐
相关产品推荐

