Но они ж тогда будут как в математике, а не как в программировании?
Что делать, если нужны именно изменяемые эллипс и окружность?
Код:
class ImmutableEllipse
{
protected double a, b;
ImmutableEllipse(double a, double b);
double area();
double length();
…
}
class Ellipse:
public ImmutableEllipse
{
Ellipse(double a, double b);
void compress_x(double factor);
void compress_y(double factor);
…
}
class Circle:
public ImmutableEllipse
{
Circle(double radius);
// create an Ellipse object out of Circle
Ellipse* Ellipse();
// override length with simpler one
double length();
void compress(double factor);
…
}
Просто есть противоречие между принципом ООП "всё, что можно делать с предком, должно гарантированно работать и с потомком" (не помню, как называется) и наивным представлением о наследовании как о теоретико-множественном включении.
Я вижу здесь другой конфликт: между математическим и «программистким» терминами. Соответственно, и предлагаемый мною подход. При этом соблюдаются и принцип Барбары Лисков, и теоретико-множественное включение. Хотя наблюдается некоторая неуклюжесть названий: «неизменяемый» эллипс — это не эллипс, который не может меняться, а эллипс, который
мы не умеем менять. В некотором смысле, полуфабрикат. В то же время, объект этого типа не является «неизменяемый»
в строгом смысле этого слова в программировании, когда после создания объекта гарантирована неизменность его свойств. Так что, быть может, стоило бы поискать другое имя.
каждый, кто сталкивается с собственным недопониманием компонентов объектного подхода в первую очередь списывает затруднения на несовершеннство ООП, а не на свой счёт.
Куда приятнее чувствовать себя лучше других, чем понимать своё несовершенство.
Но вот увы: я так и не понимаю, что такое ООП. ООА, ООД — чуть-чуть понимаю, процентов так на 30-50. Хотя мне бы хотелось получить столь же сильные инструменты, как формализм структурного программирования. Между прочим, принцип Б.Лисков — акурат перенос требований структурного программирования на ООД. А дальше? Где свои инструменты?