"抽象静态"方法 - 如何?

pol*_*lot 12 oop static-methods abstract-methods

关于为什么没有抽象的静态方法/字段,已经有几个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; }
Run Code Online (Sandbox Code Playgroud)

这是问题:假设我想确保每个继承的类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();
}
Run Code Online (Sandbox Code Playgroud)

Chr*_*dal 3

你的伪代码看起来很像 Java,所以我假设你正在使用 Java。

“抽象方法需要每个实例的实现。静态方法属于整个类。抽象类中的静态方法属于抽象类,而不是潜在的实现。因此,允许抽象静态方法没有任何意义。此外,静态方法不能被重写,因此抽象静态方法将是一种异常情况。”

来自http://forums.sun.com/thread.jspa?threadID=597378

另请参阅为什么我不能在 Java 接口中定义静态方法?