Есть уже несколько SO вопросов о том, почему не существует абстрактные статический метод/поля как таковые, но я задаюсь вопрос о том, как можно было бы идти о реализации следующего псевдо-код:«Абстрактный статический» метод - как?
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
, но тогда нужно было бы создать экземпляр класса, чтобы узнать, сколько ног у этого животного - хотя это и не нужно.
Как обычно удается реализовать эту ситуацию?
EDIT: Здесь, как я могу это использовать. Предположим, (теперь это смешно, но так или иначе ...), что число ног каждого животного уникален, так что я мог бы иметь что-то вроде:
Animal getModelAnimal(int numberOfLegs) {
if (numberOfLegs == Chicken.getNumberOfLegs()) return new Chicken();
else if (numberOfLegs == Dog.getNumberOfLegs()) return new Dog();
}
-1: Вы не можете сказать это вообще. абстрактный метод не всегда не имеет смысла (см. мой пост). – Simon
Отредактировал свой ответ, чтобы отразить это. –
Мой вопрос должен быть агностиком языка (раньше я сталкивался с аналогичной проблемой на C#). Я вижу, почему в языке нет «абстрактного статического» модификатора, но мне больше интересно узнать, как можно чисто реализовать проблему, о которой я говорил в вопросе. – polyglot