【问题标题】:Do I need a constructor with Inheritance?我需要一个带有继承的构造函数吗?
【发布时间】:2012-02-13 20:27:29
【问题描述】:

我对类(POCO's?)有以下内容,其中第二个应该扩展第一个。

我猜我需要一个引用基本实例的属性,在这种情况下是 Business,但我是否还需要一个构造函数来“填充”该属性,因为没有 Business,保险公司就不能存在?

我对此的参考是基础数据库,其中tblInsuranceCompany 对列BusinessID 有一个FK 约束回到tblBusiness。

另外,我是 OOP 的新手,所以请指出您可能认为“错误”的任何其他内容。谢谢,

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);
    }
}

【问题讨论】:

  • 是InsuranceCompany "is-a" Business 还是 "has-a" Business?你两者都做,这是错误的。
  • @SLaks:所以继承 (:Business) 定义了一个“is-a”,但属性 public Business Business 定义了一个“has-a”?如果这是正确的,那么感谢您为我澄清这一点。如果您知道我的意思,我知道我从未将其应用于“工作代码”的 2 之间的区别。谢谢!

标签: c# .net oop inheritance


【解决方案1】:

我猜我需要一个引用基本实例的属性,在这种情况下是业务,

不,你不需要这个。 InsuranceCompany 是企业。它还将具有Business 的所有属性,因为它继承自Business。您不需要属性来引用它,因为对 InsuranceCompany 对象的引用将与对“业务”部分的引用相同(它们是相同的对象)。

但是我是否还需要一个构造函数来“填充”该属性,因为没有企业就不能存在保险公司?

所有类都有一个构造函数 - 当你构造一个 InsuranceCompany 时,它也会有效地构造“业务”。

话虽如此,您可能需要一个将相关信息传递给基类构造函数的构造函数 - 但如果您不提供,编译器将为您创建一个默认构造函数。

【讨论】:

  • 谢谢,这是有道理的,但会导致另一个问题,如果我添加一个构造函数,这意味着这不再是 POCO,对吗?那我应该再上一堂课,还是我把两者混淆了。
  • @RefractedPaladin 你可以有一个构造函数,但仍然是一个 POCO - 尽管除了任何带参数的构造函数之外,有一个默认构造函数通常很好,这取决于使用场景......
【解决方案2】:

我不太确定,如果您在这里将继承与组合混淆了。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2011-04-21
      • 2014-06-08
      • 2022-11-03
      • 1970-01-01
      • 2023-03-18
      • 2018-03-31
      • 1970-01-01
      • 2014-02-03
      • 2020-07-22
      相关资源
      最近更新 更多