You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复用基类构造函数中已传入的计算参数?避免重复计算

解决方案

当然可以避免重复计算,针对你的场景,有几种实用的方案:

方案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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:13:19