В каких случаях суперкласс не должен быть абстрактным? - PullRequest
7 голосов
/ 30 ноября 2010

В этом потоке я обнаружил интересный момент: если класс использует только суперкласс, нет правила делать его абстрактным.Почему так?

Спасибо

Ответы [ 3 ]

10 голосов
/ 30 ноября 2010

Все зависит от того, имеет ли смысл иметь экземпляры класса .

Предположим, у вас есть, например, один класс Dog и один класс Cat. Они оба простираются Animal. Теперь Animal может иметь имя и несколько методов, но не имеет смысла запускать Animal s. Animal - это ... хорошо абстрактное понятие.

В других обстоятельствах у вас могут быть подклассы (например, LinkedHashSet расширяет HashSet), но все еще имеет смысл создавать экземпляр суперкласса (в данном случае HashSet).


Чтобы ответить на ваш комментарий: " Имеет ли смысл делать класс неабстрактным, даже если вы не хотите создавать его экземпляр. "

Хорошо, я бы сказал, что если вы сегодня просто не знаете ни одного варианта использования, в котором он должен быть создан, применяется то же правило: Имеет ли смысл (логически) иметь экземпляр класс? Если так, сделайте его неабстрактным.

Если ситуация больше похожа на " Если вы создали экземпляр этого класса, вы, вероятно, делаете это неправильно! ", тогда я бы прояснил это, сделав класс абстрактным.

4 голосов
/ 30 ноября 2010

Исходя из @aioobe - Подумайте о следующей ситуации.

В компании у вас есть должность под названием Бухгалтер . Теперь предположим, что гипотетически у вас есть кто-то, кто специализируется на аудите , и мы говорим, что его звание Auditor . Сейчас в компании 100 бухгалтеров, но только 4 аудитора. В этом случае вы захотите создать экземпляры Accountant и Auditor , хотя Accountant является суперклассом 1017 * аудитор .

1 голос
/ 30 ноября 2010

Если класс завершен и его можно использовать, то имеет смысл иметь возможность создавать и использовать его, даже если пользователь решит расширить его позже.

Класс должен быть абстрактным, только если пользовательнеобходимо реализовать некоторую логику, чтобы сделать его функциональным в рамках, в которых он используется, т. е. где разработчик класса не знает точных деталей реализации того, как будет использоваться класс, например, шаблонов или шаблонов разработки команд.

...