Во-первых, я бы предложил вам удалить метод addUser как из Регистра, так и из Клиента - таким образом, у вас есть некоторая гарантия, что метод не привязан к какому-либо конкретному варианту использования и, следовательно, будет использоваться повторно.
Затем вам нужно будет создать механизм для обоих контекстов вызова (Customer и Register) для взаимодействия с методом addUser. Для этого вы можете использовать какой-то объект данных, которым они обмениваются, и затем, как только они получат его обратно, они извлекают данные, которые они хотят, или вы можете позволить им обоим реализовать интерфейс, с помощью которого метод addUser может быть передан, с которым он будет и назад, что он захватывает.
Я не чувствую, что использование наследования является хорошим средством повторного использования в этом случае. Наследование - это то, что нужно делать осторожно, так как оно может также увеличить зависимости. Важно придерживаться идеи, что при использовании наследования наследование двух типов должно иметь определенную связь наследования - я не думаю, что это так.
Так что тогда пользователь Register может вызвать этот addUser метод и класс Customer могут вызвать этот метод addUser, а затем добавить дополнительные поля, которые он включает.