将类声明为另一个类中的属性

本文关键字:属性 声明 另一个 | 更新日期: 2023-09-27 18:28:41

我从这篇文章中复制了这段代码,我不知道为什么要将类中的类定义为属性。另外,当类PersonalLoan被实例化时会发生什么?

public class PersonalLoan
{
    public string AccountNumber { get; set; }
    public string AccounHolderName { get; set; }
    public Loan LoanDetail { get; set; }
    public PersonalLoan(string accountNumber)
    {
        this.AccountNumber = accountNumber;
        this.AccounHolderName = "Sourav";
        this.LoanDetail = new Loan(this.AccountNumber);
    }
}
public class Loan
{
    public string AccountNumber { get; set; }
    public float LoanAmount { get; set; }
    public bool IsLoanApproved { get; set; }
    public Loan(string accountNumber)
    {
        Console.WriteLine("Loan loading started");
        this.AccountNumber = accountNumber;
        this.LoanAmount = 1000;
        this.IsLoanApproved = true;
        Console.WriteLine("Loan loading started");
    }
}

将类声明为另一个类中的属性

我怀疑这个代码片段是你应该避免的一个例子:类PersonalLoanLoanDetail类型Loan的属性暗示了类之间的关系。换句话说,这个代码片段的作者试图说

个人贷款有贷款

然而,这不太可能是他们试图建立的关系:实际上,

个人贷款是一种贷款

关系 is-a 是使用继承而不是组合建模的。换句话说,他们应该写这个:

public class PersonalLoan : Loan {
    public PersonalLoan(string accountNumber) : base(accountNumber) {
        ...
    }
    ...
}

另一个指向模型不正确的问题是PersonalLoan和其中的Loan具有相同的accountNumber,它存储在同一对象的两个位置。当你看到这一点时,你就知道有些事情不对劲了。你得到两个帐号的原因是,当PersonalLoan被实例化时,它的构造函数也会实例化Loan,并传递相同的accountNumber

这并不是说将对象嵌入到其他对象中是错误的。例如,如果您要将借款人地址建模为一个类,则最终会得到如下所示的内容:

class Address {
    public string Country {get;set;}
    public string City {get;set;}
    ... // And so on
}
class Borrower {
    public Address MailingAddress  {get;set;}
    ... //
}

这个模型是完全有效的,因为借款人有一个地址