Комплекс на самом деле не расширяет Реал. Вещественное число - это просто частный случай Complex (мнимая часть равна 0). Если Complex расширяет Real и полагается на арифметические операции Real, то они будут неверными. Например, операция Add добавит действительные части и вернет Real.
Распространенной ошибкой при изучении ООП является повсеместное рассмотрение отношений наследования, хотя на самом деле они гораздо реже. Часть проблемы в том, что книги и плохие классы увековечивают это, давая вам ужасный пример (гораздо больше в 90-х, но это все еще так). Композиция встречается гораздо чаще.
Чтобы дать вам пример Java (поскольку вы не упоминаете язык, а реальный код часто более полезен, чем описания псевдокодов), возможно, более уместно:
public class Complex {
private final double real;
private final double imaginary;
private Complex(double real) {
this(real, 0.0d);
}
private Complex(double real, double imaginary) {
this.real = real;
this.imaginary = imaginary;
}
public static Complex makeReal(double real) {
return new Complex(real);
}
public static Complex makeComplex(double real, double imaginary) {
return new Complex(real, imaginary);
}
public Complex add(Complex other) {
return makeComplex(real + other.real, imaginary + other.imaginary);
}
...
}
Примечание: это демонстрирует еще две полезные концепции для изучения:
- Неизменность. Вы не можете изменять Комплекс после его создания. Это невероятно полезно;
- Методы фабрики. Обратите внимание, что конструкторы являются частными. Это является преднамеренным и позволяет вам контролировать, как создаются объекты. Например, если кто-то дважды вызывает makeReal (3.0d), вы можете заставить его возвращать один и тот же экземпляр, а не каждый раз создавать новый.