2

Animal という抽象クラスがあり、次に Animal クラスを拡張する Dog や Cat などのクラスがあります。

親クラス Animal のすべての子クラスに静的メソッド getProperties があることを確認したいと思います。私のコードにアクセスできない他の誰かが新しい Animal 子クラスを実装したとしても。

クラス Dog のすべての Animal はまったく同じプロパティを持っているため (または、Dog が一般的にどのように見えるかを知るために Dog は必要ないため)、静的にしたいので、クラスタイプで呼び出されるメソッドであることが理にかなっています。クラスインスタンスではなく。

これは可能ですか?

4

6 に答える 6

2

Javaの Astaticは、メソッド (たとえば) がクラスのどのインスタンスにも関連付けられていないことを意味します。これはすべてのインスタンスに共通であり、その実装はクラス内にネストされているだけです。

あなたの問題を読んだとき、クラスabstractにメソッドが必要だと思います。Animal

public abstract class Animal {
    public abstract <some-return-type> getProperties();
}

この場合、継承するすべてのクラスはメソッドAnimalの実装を提供する必要があります(この場合はそうではありません)。getProperties static

静的にしたい場合は、(Animalクラス内で)そうするだけですが、単一共有実装ができます。

于 2013-08-01T12:27:21.187 に答える
1

Javaオブジェクト モデルは、クラス側の継承をサポートしていません (Smalltalk や Ruby とは異なります)。たとえば、次のように、ドメインのメタモデルを明示的に実装する必要があります。

public abstract class AnimalDescriptor<T> { // or <T extends Animal>

    public abstract List<String> getProperties();

    public abstract T newAnimal();

}

public class DogDescriptor extends AnimalDescriptor<Dog> {

    public static final DogDescriptor INSTANCE = new DogDescriptor();

    public List<String> getProperties() { ... }

    public Dog newAnimal() { return new Dog(); }

}

void doStuff(AnimalDescriptor<?> desc) {
    desc.getProperties();
}

doStuff(DogDescriptor.INSTANCE);

これは一例にすぎません。必要に応じて調整する必要があります。たとえばgetDescriptor()、動物側にメソッドを追加したい場合があります。

于 2013-08-01T12:51:32.700 に答える
1

いいえ、できません。静的コンテキストには継承はありません。いいえ、静的メソッドを実装するクラスを強制する方法はありません。

于 2013-08-01T12:27:20.843 に答える
0

これはJavaでは不可能です。静的メソッドを「隠す」ことはできますが、「オーバーライド」することはできません。

于 2013-08-01T12:26:56.860 に答える
0

各 Animal クラスにそれに関するメタデータを提供させたい場合はgetPropertiesgetNumberOfLegsgetLocomotionType、 などのインスタンス メソッドを与えます。静的定数を使用してこれらを実装できます。

public abstract class Animal {
    public abstract int getNumberOfLegs();
}

public class Dog {
    private static final NUMBER_OF_LEGS = 4;
    public int getNumberOfLegs() {
        return NUMBER_OF_LEGS;
    }
    // ...
}

Mapメソッドに何らかのが必要だったと思いますgetProperties。これに関する問題は、返すマップを不変にするように細心の注意を払う必要があることです。1 つの間違いで、誰かが全員の静的インスタンスを変更できます。メソッドをインスタンス メソッドにすると、コストはほとんどかかりません。

于 2013-08-01T12:39:11.870 に答える