«Абстрактный статический» метод - как? - PullRequest
12 голосов
/ 30 мая 2010

Уже есть несколько вопросов о том, почему не существует абстрактного статического метода / поля как такового, но мне интересно, как можно было бы реализовать следующий псевдо-код:

class Animal {
    abstract static int getNumberOfLegs(); // not possible
}

class Chicken inherits Animal {
    static int getNumberOfLegs() { return 2; }


class Dog inherits Animal {
    static int getNumberOfLegs() { return 4; }

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

Без «абстрактного статического» метода / поля можно либо исключить метод из класса Animal, тогда существует риск того, что у некоторого дочернего класса этого метода нет. Или можно сделать getNumberOfLegs методом экземпляра, но тогда нужно будет создать экземпляр класса, чтобы выяснить, сколько ног у этого животного - даже если в этом нет необходимости.

Как обычно можно реализовать эту ситуацию?


РЕДАКТИРОВАТЬ: Вот как я мог бы использовать это. Предположим (теперь это нелепо, но в любом случае ...), что количество ног каждого животного уникально, поэтому я мог бы получить что-то вроде:

Animal getModelAnimal(int numberOfLegs) {
   if (numberOfLegs == Chicken.getNumberOfLegs()) return new Chicken();
   else if (numberOfLegs == Dog.getNumberOfLegs()) return new Dog();
}

Ответы [ 11 ]

0 голосов
/ 30 мая 2010

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

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