なぜ異なるタイプのオブジェクト参照が許可されているのだろうか?例えば;
Animal cow = new Cow();
異なるタイプのオブジェクト参照を使用することが役立つ例を教えてください。
編集:Cow extends Animal
なぜ異なるタイプのオブジェクト参照が許可されているのだろうか?例えば;
Animal cow = new Cow();
異なるタイプのオブジェクト参照を使用することが役立つ例を教えてください。
編集:Cow extends Animal
これは、ポリモーフィズムと抽象化の中心です。たとえば、それは私が書くことができることを意味します:
public void handleData(InputStream input) {
...
}
...そして、ファイル、ネットワーク、メモリ内などからのあらゆる種類の入力ストリームを処理します。または、同様に、を持っている場合List<String>
は、実装などに関係なく、その要素0を要求できます。
サブクラスのインスタンスをスーパークラスのインスタンスとして扱う機能は、リスコフの置換原則と呼ばれます。緩い結合とコードの再利用が可能になります。
詳細については、Javaチュートリアルのポリモーフィズムの部分もお読みください。
これはポリモーフィズムと呼ばれ、Javaの最も強力な側面の1つです。
ポリモーフィズムを使用すると、さまざまなオブジェクトを同じように扱うことができます。
これは、再利用可能で柔軟なコードを作成するための優れた方法です。
残念ながら、新しいプログラマーが理解するのに時間がかかることが多いのはJavaの一部です。
提供した例には、継承(クラスの拡張)が含まれます。
ポリモーフィズムの利点を享受するもう1つの方法は、インターフェースを使用することです。
同じインターフェースを実装する異なるクラスは、同じように扱うことができます。
class Dog extends Animal implements Talker {
public void speak() {
System.out.println("Woof woof");
}
}
class Programmer implements Talker {
public void speak() {
System.out.println("Polymorphism rocks!");
}
}
interface Talker {
public void speak();
}
public static void testIt() {
List<Talker> talkerList = new ArrayList<Talker>();
talkerList.add(new Dog());
talkerList.add(new Programmer());
for (Talker t : talkerList) {
t.speak();
}
}
簡単に言えば、これによりポリモーフィズムが可能になります。たとえば、Animalから派生した複数のオブジェクトを作成でき、すべてが同様のハンドルになります。
あなたは次のようなものを持つことができます:
Animal[] myAnimal = {new Cow(), new Dog(), new Cat()};
foreach (Animal animal in myAnimal)
animal.Feed();
次に、Feed()メソッドを各子クラス内でオーバーライドする必要があります。
ちなみに、コードはC#に似ていますが、概念はJavaでも同じです。
これは基本的に標準化の概念です。
私たちは、各動物がいくつかの共通の特徴を持っていることを知っています。食べたり寝たりする例を見てみましょう。しかし、動物ごとに食べ方や寝方が異なる場合があります。
public abstract class Animal
{
public abstract void Eat();
public abstract void Sleep();
}
//Now Define them in various classes..
public class Cow extends Animal
{
pubic void Eat()
{
//process of eating grass
}
public void Sleep()
{
//process of sleeping
}
}
public class Lion extends Animal
{
public void Eat()
{
//process of eating flesh
}
public void Sleep()
{
//process of sleep
}
}
これで、異なるクラスに異なるオブジェクトを定義する必要はありません...動物を使用して一般的に呼び出すだけです
public class MyClass
{
public static void main(String[] args)
{
Animal _animal = new //think the type of animal is coming dynamically
//you can simply call
_animal.Eat();
_animal.Sleep();
// irrespective of checking that what can be the animal type, it also reduces many if else
}
}
別のクラス/メソッドでは、同じインターフェースの異なる実装を使用したい場合があります。あなたの例に従うと、あなたは次のようなものを持っているかもしれません:
public void feed( Animal animal ) {
animal.getHome().insertFood(animal.getFavFood());
}
これで、動物クラスに詳細を実装でき、プログラムに新しい動物を追加するたびにこのメソッドを拡張する必要はありません。
したがって、実装ごとにメソッドを実装しないために共通のインターフェースが必要な場合もあれば、明示的な実装を使用する必要がある場合もあります。
簡単に言えばすべてCows
ですAnimals
。したがって、JAVACow extends Animal
は、牛が動物と呼ばれることもあることを理解しています。
他の人が指摘しているように、これはポリモーフィズムです。あなたは拡張Animal
しDog
て、犬も動物であると言うことができます。
これは継承101の質問です。
これにより、共通の機能を共有するオブジェクトを同様に扱うことができます。
また、抽象型のサブクラスである特定の実装を実行時に提供することもできます。
私はおそらく何年もの間歩き回ることができたでしょう。おそらく、このように質問はここで答えるには広すぎます。