Абстрактный член не является необязательным. Это член, который ДОЛЖЕН быть реализован для реализации конкретного класса. Если один из абстрактного члена не определен в производном классе, этот класс также является абстрактным и не может быть создан.
Это отличный пример для Принципа разделения интерфейсов : ваш интерфейс для Shape
сочетает в себе интерфейсы различных потенциально несвязанных концепций: area()
, который имеет отношение только к 2D-фигурам, и volume()
актуально только для трехмерных фигур.
Если вам нужен чистый SOLID дизайн, вам нужно рассмотреть Shape2D
с area()
и perimeter()
и Shape3D
с surface()
и volume()
.
Если вы думаете, что area()
на самом деле то же самое, что и surface()
, вы можете рассмотреть абстрактного родителя Shape
, который предоставляет абстрактное surface()
, дочернего элемента Shape2D
, который обеспечивает perimeter()
и еще один ребенок Shape3D
, который обеспечивает volume()
.
Более прагматично, вы можете считать, что volume()
из Circle
или любой другой 2D-фигуры просто 0 и придерживаться вашего первоначального дизайна.