Im starting to learn Domain-Driven-Design, and need some guidance when it comes to inheritance.
I have the following class representing an employee:
public class Employee
{
public Guid EmployeeID { get; }
public String Firstname { get; }
public String Lastname { get; }
// Constructor
private Employee(Guid employeeID, String firstname, String lastname)
{
EmployeeID = employeeID;
Firstname = firstname;
Lastname = lastname;
}
// Factory
public static Create(Guid employeeID, String firstname, String lastname)
{
return new Employee(employeeID, firstname, lastname)
}
}
THE PROBLEM
The employee can also be an owner of a company, and my question is how to build the CompanyOwner-class? Whats the recommended way to implement this?
Option 1: Inherit Employee-class
The company owner is an employee, so it feels like one way could be to inherit Employee.
However, this means that the properties EmployeeID, Firstname and Lastname must change to have protected setters in Employee-class. Is that ok in DDD?
public class CompanyOwner : Employee
{
// ID for the owner (primary key in database)
public Guid CompanyOwnerID { get; }
// Constructor
private CompanyOwnerItem(Guid companyOwnerID, Guid employeeID, String firstName, String lastName)
{
CompanyOwnerID = companyOwnerID;
EmployeeID = employeeID;
Firstname = firstname;
Lastname = lastname;
}
// Factory
public static CompanyOwnerItem Create(Guid companyOwnerID, Guid employeeID, String firstname, String lastname)
{
return new CompanyOwnerItem(companyOwnerID, employeeID, firstname, lastname);
}
}
Option 2: Separate property for employee info
By doing this the Employee-factory method can be called. But then I have to access it via MyOwner.EmployeeInfo.Firstname, it would be cleaner with just MyOwner.Firstname
public class CompanyOwner
{
// Unique ID for the owner (primary key)
public Guid CompanyOwnerID { get; }
// Employee info
public Employee EmployeeInfo { get; }
// Constructor
private CompanyOwnerItem(Guid companyOwnerID, Guid employeeID, String firstName, String lastName)
{
CompanyOwnerID = companyOwnerID;
// Calling factory-method of Employee-class to set employee-info
EmployeeInfo = Employee.Create(employeeID, firstName, lastName);
}
// Factory
public static CompanyOwnerItem Create(Guid companyOwnerID, Guid employeeID, String firstname, String lastname)
{
return new CompanyOwnerItem(companyOwnerID, employeeID, firstname, lastname);
}
}
Option 3: Skip CompanyOwner-class and use IsOwner-property in Employee-class instead
This is actually not an option in my case, since the employee can be owner for multiple companies, and also CompanyOwnerID (primary key for the owner) does not fit in the Employee-class
public class Employee
{
public Guid EmployeeID { get; }
public String Firstname { get; }
public String Lastname { get; }
public Boolean IsOwner { get; }
// Constructor
private Employee(Guid employeeID, String firstname, String lastname, Boolean isOwner)
{
EmployeeID = employeeID;
Firstname = firstname;
Lastname = lastname;
IsOwner = isOwner;
}
// Factory
public static Create(Guid employeeID, String firstname, String lastname, Boolean isOwner)
{
return new Employee(employeeID, firstname, lastname, isOwner)
}
}