Определение всего абстрактного метода в одном конкретном классе - PullRequest
1 голос
/ 28 апреля 2019

У меня есть серьезные проблемы в понимании основной темы ООП. Хотя я прошел через книгу Дител. У меня есть форма абстрактного класса.

public abstract class Shape
{
public abstract area();
public absract volume;
}
public class Circle extends Shape
{
//definition of area method
}
public class Sphere extends Shape
{
//define volume method
// define area method
}

Теперь, когда у меня есть класс Shape в качестве родительского класса и класс Circle в качестве дочернего класса, в то же время класс Shape является абстрактным классом. Теперь я хочу определить метод области в классе Circle, но не метод тома, Я хочу определить метод объема в классе Sphere. Но когда я делаю это, он показывает мне ошибку, но если я определяю оба метода в классе Circle, тогда он работает нормально. Но тогда у класса Circle есть дополнительный код объема, который не используется классом Circle.

1 Ответ

3 голосов
/ 29 апреля 2019

Абстрактный член не является необязательным. Это член, который ДОЛЖЕН быть реализован для реализации конкретного класса. Если один из абстрактного члена не определен в производном классе, этот класс также является абстрактным и не может быть создан.

Это отличный пример для Принципа разделения интерфейсов : ваш интерфейс для Shape сочетает в себе интерфейсы различных потенциально несвязанных концепций: area(), который имеет отношение только к 2D-фигурам, и volume() актуально только для трехмерных фигур.

Если вам нужен чистый SOLID дизайн, вам нужно рассмотреть Shape2D с area() и perimeter() и Shape3D с surface() и volume().

Если вы думаете, что area() на самом деле то же самое, что и surface(), вы можете рассмотреть абстрактного родителя Shape, который предоставляет абстрактное surface(), дочернего элемента Shape2D, который обеспечивает perimeter() и еще один ребенок Shape3D, который обеспечивает volume().

Более прагматично, вы можете считать, что volume() из Circle или любой другой 2D-фигуры просто 0 и придерживаться вашего первоначального дизайна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...