有时候我经常混淆何时派生类(使用继承)和何时不派生。例如,我有这样的代码:
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
}
?
答案 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!");