Java абстрактный статический Временное решение - PullRequest
24 голосов
/ 16 декабря 2009

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

Я хочу иметь либо абстрактный класс, либо интерфейс, который предписывает включение статического метода во все классы, которые расширяют / реализуют этот класс / интерфейс. Есть ли способ сделать это в Java? Если нет, то это может быть моей последней каплей с Java ...

РЕДАКТИРОВАТЬ 1: Контекст этой проблемы в том, что у меня есть группа классов, на данный момент они называются Stick, Ball и Toy, у которых есть несколько записей в базе данных. Я хочу создать суперкласс / интерфейс с именем Fetchable, который требует статический метод getFetchables() в каждом из классов ниже. Причина, по которой методы в Stick, Ball и Toy должны быть статическими, заключается в том, что они будут общаться с базой данных, чтобы получить все записи в базе данных для каждого класса.

РЕДАКТИРОВАТЬ 2: Для тех, кто говорит, что вы не можете сделать это на любом языке, это не так. Конечно, вы можете сделать это в Ruby, где методы класса наследуются. Это не тот случай, когда кто-то не получает OO, это случай отсутствия функциональности в языке Java. Вы можете попытаться доказать, что вам никогда не нужно наследовать статические (классовые) методы, но это совершенно неверно, и я буду игнорировать любые ответы, которые приводят такие аргументы.

Ответы [ 14 ]

0 голосов
/ 16 декабря 2009

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

В абстрактном суперклассе у меня будет статический метод getAllWidgets (тип класса). В нем я проверю класс, который вы передали, и сделаю правильную выборку на основе этого. Обычно я люблю избегать прохождения классов и использования переключателей на подобных вещах, но здесь я сделаю исключение.

0 голосов
/ 16 декабря 2009

Создайте контекстный интерфейс, содержащий ваш метод с именем, соответствующим вашему проблемному домену. (Назовите его «Мир», если вам абсолютно необходимо, но в большинстве случаев есть лучшее имя)

Передача экземпляров реализации объекта контекста.

0 голосов
/ 16 декабря 2009
0 голосов
/ 16 декабря 2009

Нет. Вы не можете сделать это. Если вы готовы пойти на компромисс и сделать метод нестатичным или предоставить реализацию статического метода в своем абстрактном классе, вы сможете написать код на Java.

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