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

C#中如何在Customer构造函数内调用Address构造函数?继承实现求助

解决方案

首先要明确:Customer和Address是组合关系(Customer包含一个Address),而非继承关系,继承在这里不符合逻辑(Customer不是一种Address),这也是你尝试继承调用带参构造无果的核心原因。下面提供几种正确的实现方式:

方法1:让Customer构造函数接收地址参数,内部实例化Address

直接在Customer的构造函数中传入Address所需的参数,然后调用Address的带参构造创建实例,避免外部重复初始化:

class Customer
{
    public Address Address { get; set; } // 建议设为public或至少internal,原代码默认是私有访问级别
    public BirthDate BirthDate { get; set; } // 修正原代码的拼写错误birthDaty
    public int NumberOfSeats { get; set; }
    public DriveType DriveType { get; set; }
    public CarBrand CarBrand { get; set; }

    // 接收地址参数+Customer自身属性参数的构造函数
    public Customer(string street, string city, string zipCode, string country,
                    BirthDate birthDate, int numberOfSeats, DriveType driveType, CarBrand carBrand)
    {
        Address = new Address(street, city, zipCode, country);
        BirthDate = birthDate;
        NumberOfSeats = numberOfSeats;
        DriveType = driveType;
        CarBrand = carBrand;
    }
}

方法2:重载Customer构造函数,支持直接传入Address实例或地址参数

这种方式兼顾灵活性,既允许外部传入已初始化的Address,也支持直接传地址参数内部创建:

class Customer
{
    public Address Address { get; set; }
    public BirthDate BirthDate { get; set; }
    public int NumberOfSeats { get; set; }
    public DriveType DriveType { get; set; }
    public CarBrand CarBrand { get; set; }

    // 直接接收Address实例的构造函数
    public Customer(Address address, BirthDate birthDate, int numberOfSeats, DriveType driveType, CarBrand carBrand)
    {
        Address = address ?? throw new ArgumentNullException(nameof(address), "地址不能为空");
        BirthDate = birthDate;
        NumberOfSeats = numberOfSeats;
        DriveType = driveType;
        CarBrand = carBrand;
    }

    // 接收地址参数,通过this调用上面的构造函数
    public Customer(string street, string city, string zipCode, string country,
                    BirthDate birthDate, int numberOfSeats, DriveType driveType, CarBrand carBrand)
        : this(new Address(street, city, zipCode, country), birthDate, numberOfSeats, driveType, carBrand)
    {
        // 无需额外逻辑,已通过this调用完成初始化
    }
}

补充说明

  1. 原代码中Customer的构造函数public Customer(Address address = new Address())会编译失败,因为Address没有无参构造函数,如果需要支持默认地址,你可以给Address添加无参构造,或者调整默认参数为null并在构造函数中处理:
public Customer(Address address = null)
{
    Address = address ?? new Address("默认街道", "默认城市", "默认邮编", "默认国家");
}
  1. 注意修正原代码中的拼写错误:birthDaty改为BirthDate,属性建议遵循C# Pascal命名规范(首字母大写)。

内容的提问来源于stack exchange,提问作者Benjamin.Ndk

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 03:22:55