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