0
votes

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)
    }

}