基于实例的关于继承的困惑

时间:2019-06-12 07:12:58

标签: c# oop inheritance aggregation

有时候我经常混淆何时派生类(使用继承)和何时不派生。例如,我有这样的代码:

json_glossary_title: example glossary
json_glossary_GlossDiv_title: S
json_glossary_GlossDiv_GlossList_GlossEntry_ID: SGML
json_glossary_GlossDiv_GlossList_GlossEntry_SortAs: SGML
json_glossary_GlossDiv_GlossList_GlossEntry_GlossTerm: Standard Generalized Markup Language
json_glossary_GlossDiv_GlossList_GlossEntry_Acronym: SGML
json_glossary_GlossDiv_GlossList_GlossEntry_Abbrev: ISO 8879:1986
json_glossary_GlossDiv_GlossList_GlossEntry_GlossDef_para: A meta-markup language, used to create markup languages such as DocBook.
json_glossary_GlossDiv_GlossList_GlossEntry_GlossSee: markup

这很有意义:

public class Payroll
{
    public void ProcessPayroll(Employee e) //abstraction
    {
         e.ProcessPayroll();
    }
}

Class Employee : Payroll
{
    public virtual void ProcessPayroll()
    {
       //Process Payroll
    }
}

class FulltimeEmployee : Employee
{
    public override void ProcessPayroll()
    {
       //Payroll processing based on fulltime employee
    }
}

因为class FulltimeEmployee : Employee ,所以FulltimeEmployee is a Employee在这里成立。

但是我对下面的关系感到困惑,因为这种继承不是IS-A relationship吗?

"IS-A" relationship

继承也总是要遵循IS-A关系吗?

另一个示例:

  

要求说“没有公司员工就无法存在”

基于此,我这样做了:

Class Employee : Payroll

现在这有意义吗?

更新:

我认为使用public class Company public class Employee : Company 可以更好地表示上述内容:

Aggregation

但是明天如果需求说明公司也可以没有员工存在,这意味着我必须参加此类并更新代码。

这是否违反public class Company { Employee E; //because Company has-a Employee }

2 个答案:

答案 0 :(得分:3)

要求说“没有公司就不能存在员工”,这意味着公司有员工。 Has-A关系也称为组成。 您不需要此Class Employee:薪资。它应该只是Employee类。

在薪资类中,已注入Employee对象,因此它可以处理即时方法。 同样,为了获得良好的实践,请遵循以下Prefer composition over inheritance?

更新部分的答案: 开闭校长说“类可以扩展,但可以修改”

public class Company
    {
        private readonly IEmployee e;
        public Company(IEmployee e)
        {
            this.e = e;
        }
    }
    public interface IEmployee
    { //Some employee related methods
    }

这里您将IEmployee注入了Company类。现在,您可以使用IEmployee的即时扩展公司类功能。 看一下“策略模式”示例,希望可以澄清您的疑问Real World Example of the Strategy Pattern

答案 1 :(得分:1)

您所说的是HAS-A关系,因此您需要作文:

public class Employee
{
  Payroll payroll;
  Company company;
  ...
}

由于每个员工都在某个地方被雇用,所以它也有一家公司供职。

另一方面,公司有员工,因此可以设计如下:

public class Company
{
  List<Employee> employees;
  ...
}

您还需要为Employee没有Company的情况做好准备,反之亦然,则类中的各个字段将为null,考虑到这一点,您需要编写方法null检查以处理这种情况,例如:

if(employees == null || employeses.Count == 0)
  Console.WriteLine("Sorry, company has no employees!");