2

これは、Java のように OOP を中心としたものでは非常に一般的なことだと確信しています。Javaでは、継承されたすべてのサブタイプを受け入れる基本型変数を作成する方法はありますか? 私が持っているかのように;

class Mammal {...}
class Dog extends Mammal {...}
class Cat extends Mammal {...}

class ABC {
    private Mammal x;

    ABC() {
        this.x = new Dog();
        -or-
        this.x = new Cat();
    }
}

任意の拡張バージョンも受け入れることができる変数が必要ですが、特定の 1 つの拡張された種類ではありません。

私が知っているが使いたくない方法がいくつかあります。サブタイプごとに属性を作成し、実際に使用する属性を 1 つだけにすることができます。配列を作成し、そこに押し込みます。

「基本クラス」型変数を取得する他のアイデアや方法はありますか?


ポリモーフィック ダック タイピングを Java で使用するのは良いアイデアではないことはわかっていますが、それを避けることはできないと思います。サブクラス メソッドを動的に使用して変数のキャスト バージョンを再割り当てする唯一の方法です。つまり、これでエラーが発生します。

Mammal x;
x = new Dog();
System.out.println(x.getClass());
x.breath();
if (x instanceof Dog) {
  x.bark();
} else if (x instanceof Cat) {
  x.meow();
}

シンボルが見つからないと言っていますが、これは機能します。

Mammal x;
x = new Dog();
System.out.println(x.getClass());
x.breath();
if (x instanceof Dog) {
  Dog d = (Dog) x;
  d.bark();
} else if (x instanceof Cat) {
  Cat c = (Cat) x;
  c.meow();
}

それを行う唯一の方法は最後のものですか?

4

1 に答える 1

1

次のものがある場合:

class Mammal {...}
class Dog extends Mammal {...}
class Cat extends Mammal {...}

次にDogのサブタイプですMammalCatのサブタイプでもありMammalます。この型ポリモーフィズムにより、実際には次のことが可能になります。

Mammal x;
x = new Dog(); // fine!
x = new Cat(); // also fine!

実際に後で次の場合:

class Platypus extends Mammal {...} // yes it's true!

次に、次のこともできます。

x = new Platypus(); // fine!

このポリモーフィックなサブタイピングの関係は、オブジェクト指向プログラミングの基本原則の 1 つです。

こちらもご覧ください


instanceof比較演算子について

以下があるとします。

class Mammal { void lactate(); }
class Dog extends Mammal { void bark(); }
class Cat extends Mammal { void meow(); }

次に、instanceof型比較演算子 ( §15.20.2 ) を使用して、次のようなことを行うことができます。

Mammal x = ...;

if (x instanceof Dog) {
   Dog d = (Dog) x;
   d.bark();
} else if (x instanceof Cat) {
   Cat c = (Cat) x;
   c.meow();
}
if (x != null) {
   x.lactate();
}

なしでこれを行う方法もありますif-else。これは単純な例として示したものです。

適切な設計により、これらの種類のサブタイプの区別ロジックの一部を回避できる場合があることに注意してください。たとえば、 にメソッドがある場合Mammalは、単純に を呼び出すことができます。makeSomeNoise()x.makeSomeNoise()

関連する質問


振り返りについて

コンパイル時に不明な新しい型を処理する必要がある場合は、リフレクションに頼ることができます。一般的なアプリケーションでは、ほとんどの場合、リフレクションよりもはるかに優れた代替手段があることに注意してください。

こちらもご覧ください

于 2010-08-22T09:53:45.997 に答える