Уже есть несколько вопросов о том, почему не существует абстрактного статического метода / поля как такового, но мне интересно, как можно было бы реализовать следующий псевдо-код:
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();
}