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调用完成初始化 } }
补充说明
- 原代码中
Customer的构造函数public Customer(Address address = new Address())会编译失败,因为Address没有无参构造函数,如果需要支持默认地址,你可以给Address添加无参构造,或者调整默认参数为null并在构造函数中处理:
public Customer(Address address = null) { Address = address ?? new Address("默认街道", "默认城市", "默认邮编", "默认国家"); }
- 注意修正原代码中的拼写错误:
birthDaty改为BirthDate,属性建议遵循C# Pascal命名规范(首字母大写)。
内容的提问来源于stack exchange,提问作者Benjamin.Ndk
相关产品推荐
相关产品推荐

