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

时间:2014-10-31 15:08:57

标签: c# class properties

我从this article复制了此代码,但我不知道为什么要将类内部的类定义为属性。此外,当实例化类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");
    }
}

1 个答案:

答案 0 :(得分:3)

我怀疑此代码段是您应该避免的示例:类LoanDetailLoan类型的PersonalLoan属性建议 has-a 班级之间的关系。换句话说,此代码段的作者试图说明

个人贷款有贷款

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

个人贷款是贷款

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

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

另一个指向模型不正确的问题是PersonalLoanLoan内的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;} ... // }

这并不是说在其他对象中嵌入对象是错误的。例如,如果你要将借用者地址建模为一个类,你最终会得到这样的结果:

{{1}}

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