【发布时间】:2019-10-26 15:13:12
【问题描述】:
有时我经常对何时派生类(使用继承)和何时不派生感到困惑。例如,我有这样的代码:
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 ?
Class Employee : Payroll
继承总是必须遵循 IS-A 关系?
另一个例子:
要求说“没有公司,员工就不能存在”
基于此,我这样做了:
public class Company
public class Employee : Company
现在这有意义吗?
更新:
我认为使用Aggregation 可以更好地表示上述内容:
public class Company
{
Employee E; //because Company has-a Employee
}
但是明天如果要求说公司也可以在没有员工的情况下存在,这意味着我必须来这个课程并更新代码。
这不是违反Open and Closed principle吗?
【问题讨论】:
-
员工不是工资单。那里应该没有继承关系。员工可能在工资单上,但这不是一回事。
-
Employee是Payroll的特殊类型吗?听起来不是这样。 -
继承是一种“IS-A”关系。类(实现)继承是一种特殊情况——Java 中也有可能更适合的接口。 “员工是公司”或“员工是工资单”没有意义。
-
@AndyTurner 是的,你是对的,但 Employee 是工资核算流程的一部分。所以我想了解 Is-A 关系是否对继承是强制性的
-
标签: c# oop inheritance aggregation