java – Should aggregate root expose methods for all its polymorphic children?

Consider the following fictitious toy example:

There is an aggregate root DayChecklist that holds a list of Tasks planned for the day:

class DayChecklist {
    String id;
    DateTime today;
    List<Task> tasks;
    // lots of other business logic

Task itself is modeled as:

abstract class Task {
    DateTime startTime;
    DateTime endTime;
    // lots of other common business logic

Let subtypes of Task be:

  1. TemperatureTask
class TemperatureTask extends Task {
    double temperatureAtStart;
    double temperatureAtEnd;

    public recordStartingTemperature(double temperature) {
        // some business logic
        temperatureAtStart = temperature;

    public recordEndingTemperature(double temperature) {
        // some business logic
        temperatureAtEnd = temperature;
  1. PressureTask
class PressureTask extends Task {
    double pressureAtStart;
    double pressureAtEnd;

    public recordStartingPressure(double pressure) {
        // some business logic
        pressureAtStart = pressure;

    public recordEndingPressure(double pressure) {
        // some business logic
        pressureAtEnd = pressure;

Please assume that the Task subtypes have a lot of common business logic like state transitions (i.e. is-a relationship makes sense) and the AR and Tasks are behavior-rich models (i.e. DDD makes sense). What differs is some specific properties (like the temperature and pressure readings above).

Now, when a Task needs to be updated (say recordStartingPressure() for a PressureTask), the update should ideally pass through the aggregate root.

  1. Does this mean that the aggregate root has a specific method defined for each subtask? In the example above, it is possible to have polymorphic recordStartReading and recordEndReading on the subtasks and the aggregate root could delegate such behavior. However, I am asking about the more general case when such polymorphism cannot easily be extracted.
  2. Also, what if it is certain that more Task types will be added in the future. Does that mean that corresponding methods also get added to the AR? This will violate OCP. Should some pattern be used for such a situation to allow extensibility?