[[inheriting-from-a-parent-step]] = Inheriting from a Parent `Step` [role="xmlContent"] If a group of `Steps` share similar configurations, then it may be helpful to define a "`parent`" `Step` from which the concrete `Steps` may inherit properties. Similar to class inheritance in Java, the "`child`" `Step` combines its elements and attributes with the parent's. The child also overrides any of the parent's `Steps`. [role="xmlContent"] In the following example, the `Step`, `concreteStep1`, inherits from `parentStep`. It is instantiated with `itemReader`, `itemProcessor`, `itemWriter`, `startLimit=5`, and `allowStartIfComplete=true`. Additionally, the `commitInterval` is `5`, since it is overridden by the `concreteStep1` `Step`, as the following example shows: [source, xml, role="xmlContent"] ---- ---- [role="xmlContent"] The `id` attribute is still required on the step within the job element. This is for two reasons: * The `id` is used as the step name when persisting the `StepExecution`. If the same standalone step is referenced in more than one step in the job, an error occurs. [role="xmlContent"] * When creating job flows, as described xref:step/controlling-flow.adoc[later in this chapter], the `next` attribute should refer to the step in the flow, not the standalone step. [[abstractStep]] [role="xmlContent"] [[abstract-step]] == Abstract `Step` [role="xmlContent"] Sometimes, it may be necessary to define a parent `Step` that is not a complete `Step` configuration. If, for instance, the `reader`, `writer`, and `tasklet` attributes are left off of a `Step` configuration, then initialization fails. If a parent must be defined without one or more of these properties, the `abstract` attribute should be used. An `abstract` `Step` is only extended, never instantiated. [role="xmlContent"] In the following example, the `Step` (`abstractParentStep`) would not be instantiated if it were not declared to be abstract. The `Step`, (`concreteStep2`) has `itemReader`, `itemWriter`, and `commit-interval=10`. [source, xml, role="xmlContent"] ---- ---- [[mergingListsOnStep]] [role="xmlContent"] [[merging-lists]] == Merging Lists [role="xmlContent"] Some of the configurable elements on `Steps` are lists, such as the `` element. If both the parent and child `Steps` declare a `` element, the child's list overrides the parent's. To allow a child to add additional listeners to the list defined by the parent, every list element has a `merge` attribute. If the element specifies that `merge="true"`, then the child's list is combined with the parent's instead of overriding it. [role="xmlContent"] In the following example, the `Step` "concreteStep3", is created with two listeners: `listenerOne` and `listenerTwo`: [source, xml, role="xmlContent"] ---- ----