3

ポリモーフィズムについて勉強していました。これら 2 つの機能について、Java での類推を判断できませんでした。

class は、そのサブクラスとしておよびをAnimal持つ具体的なスーパークラスであるとしましょう。これが継承のケースであることを私は知っています。しかし、クラス、クラスのポリモーフではありませんか?CatDogCatDogAnimal

私はJavaのインターフェースをよく知っています。ポリモーフィズムを説明するために具体的なクラスの代わりにインターフェイスが使用される理由が理解できませんでした。インターフェイスを作成する全体の目的は、ポリモーフを作成することである可能性がありますが、具体的なクラスではなく、なぜインターフェイスなのか知りたいですか?

4

5 に答える 5

7

継承

class Animal{
  public void speak(){ System.out.println("Speaking something");}
}

class Person extends Animal{
 @Override
 public void speak(){ System.out.println("Hello..");}
}  

ポリモーフィズム

Animal a  = new Person();
a.speak();// Hello

多型の辞書的定義は、生物または種が多くの異なる形態または段階を持つことができる生物学の原則を指します。この原則は、オブジェクト指向プログラミングや Java 言語などの言語にも適用できます。クラスのサブクラスは、独自の動作を定義しながら、親クラスと同じ機能の一部を共有できます[..]


なぜインターフェース?

何をする必要があるかはわかっているが、実装者にそれを行う方法を決定してもらいたい場合は、実装者に強制的に実装させます

于 2012-06-11T02:25:24.450 に答える
2

インターフェイスは、1 つのタイプのポリモーフィズム、つまりメソッドのオーバーライドを使用します。

インターフェイスは、一般的に使用されるメソッドのコントラクトとしてよく使用されます。

于 2012-11-20T10:08:40.040 に答える
1

インターフェースがポリモーフィズムを説明する最良の方法であるかどうかはわかりません。ポリモーフィズムは継承の副産物です。これは、継承階層を見るときにオブザーバーの観点から起こることです。すべての動物が音を出すことができるかもしれませんが、観察者が実際に動物が音を出すのを観察すると、猫は鳴き声を上げ、犬は吠えます。そして、小さな犬はイップスし、大きな犬はイップスします。ポリモーフィズムとは、継承階層での位置に基づいて、これらの属性を暗黙的に表示させる機能です。

インターフェースは、構成を実現する方法です。他の関連オブジェクトまたは非関連オブジェクトが持つ場合と持たない場合があるオブジェクトに属性を追加できます。犬はよだれをたらしている。猫がスクラッチャーである間。必ずしも動物の継承階層の一部ではない他のものも、これらのよだれを垂らしたり引っ掻いたりする属性を持つ可能性があります。

于 2012-06-11T02:30:55.170 に答える
1

extends継承は、またはimplementsキーワードをそれぞれ使用して、スーパークラスまたはインターフェースのメソッド/フィールドの単純な拡張としてJavaに実装されます。いずれの場合も、サブクラス内でスーパークラスのパブリックおよび保護されたデータメンバーにアクセスでき、外部からサブクラスを操作する場合は、パブリックデータメンバーのみにアクセスできます。

あなたの例をとると、いくつかのクラスの定義を持つことができます:

class Animal {
    private int location;

    public Animal() {
        location = 0;
    }

    public void move() {
        location += 10;
    }

    public int getLocation() {
        return location;
    }
}

class Dog extends Animal {
    @Override
    public void move() {
        setLocation(getLocation() + 5);
    }
 }

/*
 * The @Override flag is optional, but I prefer to put it there
 * to ensure that I am actually overriding a method or implementing
 * a method from an interface.
 */

class Cat extends Animal {
    @Override
    public void move() {
        setLocation(getLocation() + 15);
    }
}

したがってDogCat両方とも動物を拡張します-これは継承関係です。

ポリモーフィズムはまったく異なるものです。ウィキペディアによると:

業界でのポリモーフィズムの主な用途(オブジェクト指向プログラミング理論)は、異なるタイプに属するオブジェクトが、それぞれが適切なタイプ固有の動作に従って、同じ名前のメソッド、フィールド、またはプロパティの呼び出しに応答する機能です。

簡単な英語の用語では、これは単に同じアイデアまたはアクションを取り、それが特定のタイプのオブジェクトに基づいて異なる方法で実装することを意味します。コード内:

public static void main(String[] args) {
    Animal animalArray = {
        new Animal(),
        new Cat(),
        new Dog()
    };

    for (Animal a : animalArray) {
        a.move();
    }

    System.out.println("Animal location: " + animalArray[0].getLocation());
    System.out.println("Cat location: " + animalArray[1].getLocation());
    System.out.println("Dog location: " + animalArray[2].getLocation));
}

これにより、次の出力が生成されます。

Animal location: 10
Cat location: 15
Dog location: 5

各オブジェクト、、、、およびはすべてsとしてアクセスされることに注意AnimalCatDogくださいAnimal。これが可能なのは、すべてのクラスがであるか拡張されているためです。Animalしたがって、各クラスには常にパブリックメソッドがmove()あり、場合によっては単純に再定義されます。

インターフェイスは同じ哲学で機能します。クラスがインターフェースを拡張する場合、インターフェースで定義されたすべてのメソッドの実装が保証されるため、インターフェースが実装するメソッドの観点から使用できます。

于 2012-06-11T02:35:00.567 に答える
0

プログラミング言語を作成するために雇われたとしましょう。これは要件の1つです。

1 > 3 should call code from the integer comparison library.
1.0 > 3.0 should call code from the floating point comparison library.
"McDonald" > "MacDonald" should call code from the locale-aware string comparison library.

その要件は「ポリモーフィズム」であり、同じテキスト(>演算子)が状況(この場合はオペランドのタイプ)に応じて異なることを行います。

これらの要件を満たすには、整数、浮動小数点数、および文字列をすべて同じ基本クラスから派生させ、基本クラスを仮想比較演算子を持つものとして定義します。これは厄介になる可能性があります。後で、言語ユーザーが望む場合...

blue > yellow

...カラー操作を実行するコードにコンパイルするために、基本クラスのアプローチは、色、文字列、浮動小数点数、および整数がすべて、より一般的なベースの特殊なケースであると言うことを意味します。それは変だと思います。

もう1つのアプローチは、アプリケーション開発者が任意の型を作成してサポートする操作を言う方法を言語で提供し、ライブラリ開発者が一連の操作をサポートする任意の型の関数を提供する方法を提供することです。たとえば、比較演算子と代入演算子をサポートする任意の型の並べ替えルーチンを作成できます。

このアプローチはインターフェイスと呼ばれ、実際には非常に異なるタイプでうまく機能するという利点があります。

于 2012-06-11T02:43:34.100 に答える