我需要在继承中使用构造函数吗?

3
我有以下两个类(POCO's?),第二个类应该是扩展第一个类。我想我需要一个属性来引用基础实例,这种情况下是Business,但我是否还需要构造函数来“填充”该属性,因为保险公司不能没有业务存在呢?
我的参考资料是底层数据库,其中tblInsuranceCompany在列BusinessID上有一个FK约束返回到tblBusiness。
此外,我对面向对象编程非常陌生,所以请指出您看到的其他任何“错误”。谢谢,
public class Business
{
    public int BusinessID { get; set; }

    public BusinessType BusinessType { get; set; }

    public string Name { get; set; }

    public string ContactName { get; set; }

    public string EmailAddress { get; set; }

    public DateTime? InactiveDate { get; set; }

    public IList<Address> Addresses { get; set; }

    public IList<Phone> Phones { get; set; }

    public string DisplayString { get { return this.ToString(); } }

    public override string ToString()
    {
        return String.Format("{0}: {1}", Name, BusinessType.TypeDescription);
    }
}

public class InsuranceCompany : Business
{
    public int InsuranceCompanyID { get; set; }

    public Business Business { get; set; }

    public InsuranceCompanyType InsuranceCompanyType { get; set; }

    public string DRIInsuranceCompanyNumber { get; set; }

    public string DisplayString { get { return this.ToString(); } }

    public override string ToString()
    {
        return String.Format("{0}: {1}", Business.Name, InsuranceCompanyType.TypeDescription);
    }
}

6
InsuranceCompany是"拥有一个"业务(has-a Business)还是"是一个"业务(is-a Business)?你现在两种都在用,这样是错误的。 - SLaks
@SLaks:所以继承(:Business)定义了一个"is-a",但属性public Business Business定义了一个"has-a"? 如果是这样的话,那么感谢您为我澄清这一点。我知道这两者之间的区别,只是从未将其应用到"工作代码"中,如果您明白我的意思的话。谢谢! - Refracted Paladin
3个回答

5
我猜想您需要一个引用基础实例的属性,这个实例在此处指的是Business。
不需要这么做。InsuranceCompany就是Business。同时,它也具有从Business继承而来的所有属性。您不需要一个属性来引用这个实例,因为对InsuranceCompany对象的引用将是与指向Business部分的引用相同的引用(它们是同一个对象)。
但是,我需要一个构造函数“填充”该属性,因为没有Business,保险公司无法存在吗?
所有类都有构造函数-当您构建InsuranceCompany时,它将有效地构建“business” 。
话虽如此,您可能需要一个构造函数,它将相关信息传递给基类构造函数--但如果您不提供一个,编译器将为您创建一个默认构造函数。

谢谢,这很有道理,但是又引出了另一个问题,如果我添加一个构造函数,那么这就不再是POCO了,对吗?我应该再创建另一个类,还是我把它们混淆了。 - Refracted Paladin
@RefractedPaladin 你可以拥有一个构造函数并且仍然是POCO - 虽然通常最好除了任何带参数的构造函数之外还有一个默认构造函数,这取决于使用场景... - Reed Copsey

1

我不太确定你是否在混淆继承和组合的概念。

如果InsuranceCompany是一种业务类型,那么继承可能是一个可行的解决方案。在这种情况下,您不需要一个Business属性,对象本身就是一个业务,并具有所有相关属性。InsuranceCompany和Business不是两个不同的实例,它们是一个整体。


0

您可以在 InsuranceCompany 中使用 Name 属性(或 base.Name),并从派生类中删除 Business 属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接