Иногда меня часто путают между тем, когда выводить класс (использовать наследование), а когда нет. Так, например, у меня есть такой код:
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
Becuase 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
}
Но завтра, если требование говорит Компания может существовать и без Employee , что означает, что я должен прийти в этот класс и обновить код.
Разве это не нарушит Open and Closed principle
?