2

私はポリモーフィズムと混同していますが、これはポリモーフィズムと見なされるのでしょうか?

ちょっと奇妙に見えますが、それでも正しくコンパイルされます。

public class Family {
    void FamilyInfo() {
        System.out.println("This is a family super class");
    }
}

public class Grandparents extends Family {
    void FamilyInfo() {
        System.out.println("Graparents are the elders in the family and they are the sub class of family");
    }
}

public class Parents extends Grandparents {
    void FamilyInfo() {
        System.out.println("The parents are the children of the grandparents and they are the sub sub class for family");
    }
}

public class FamilyDemo {
    public static void main(String ary[]) {
        Grandparents Gp = new Grandparents();
        Parents P1 = new Parents();


        Gp.FamilyInfo();
        P1.FamilyInfo();

    }
}
4

8 に答える 8

3

メソッドFamilyInfoは、階層内の 3 つのクラスすべてでオーバーライドされています。これは の一例ですpolymorphism

呼び出すとき:クラスでGp.FamilyInfo();実装されたメソッドを呼び出して印刷し、クラスでメソッドを呼び出して印刷します。GrandparentsGraparents are the elders in the family and they are the sub class of familyP1.FamilyInfo();ParentsThe parents are the children of the grandparents and they are the sub sub class for family

FamilyInfo()したがって、同じメソッドに 2 つの異なる動作があることがわかります。これはポリモーフィックな動作です。

あなたの例は、ここのチュートリアルで言及されているものと非常に似ています: Java Tutorial : Polymorphism。混乱しないでください。

于 2012-12-18T04:14:29.877 に答える
1

この例では、ポリモーフィズムを示していません。単純なオブジェクト指向の継承を確認できます。ポリモーフィズムの概念を使用するには、コードを次のようにする必要があります。

public class FamilyDemo 
{
    public static void main(String ary[]) 
    {
        Family Gp = new Grandparents();
        Family P1 = new Parents();

        Gp.FamilyInfo();
        P1.FamilyInfo();
    }
}

Gpは typeですが、その型のオブジェクトで初期化されるため、Familytype のように動作します。Grandparents

次に、次のことが予想される場合があります。祖父母は家族の長老であり、家族のサブクラスです。両親は祖父母の子供であり、家族のサブサブクラスです。

于 2012-12-18T04:27:40.787 に答える
1

私たちのトレーナーは、 extends の使用は継承の例であると述べました。しかし、implements(interface) を使用すると、多くのインターフェイスを実装できるため、ポリモーフィックであると言えます。

例えば

interface Horse {
    void run();
}

interface Eagle {
    void fly();
}

public class Pegasus implements Horse, Eagle {
    // Implement methods
     public void run() {
         // do run
     }
     public void fly() {
         // do fly
     }
 }
于 2012-12-18T04:31:07.443 に答える
0

技術的に言えば、これはポリモーフィズムです。しかし、お粗末な例を選択したため、ポリモーフィズムの背後にある考え方を十分に理解していないようです。より良い例は、次のようなものです。

public abstract class Shape {
  public abstract void drawShape();
}

public class Rectangle extends Shape {
  public void drawShape() {
    // code for drawing rectangle
  }
}

public class Circle extends Shape {
  public void drawShape() {
    // code for drawing circle
  }
}

public class FilledRectangle extends Rectangle {
  public void drawShape() {
    super.drawShape();
    // code for filling rectangle
  }
}

その場合、描画を担当するクラスは、個々の形状を描画する方法を知る必要はありません。代わりに、これを行うことができます

public void drawAllShapes(Shape[] myShapes) {
  for (int i = 0; i < myShapes.length; ++i) {
    myShapes[i].drawShape();
  }
}

目標は、具体的な実装とそれに付随するすべての詳細を抽象化し、代わりに共通のインターフェイスのみを提示することです。上記の最後の方法でわかるように、これにより、さまざまなクラスでの作業がはるかに簡単になります。

于 2012-12-18T04:40:54.750 に答える
0

1.ポリモーフィズムとは

オブジェクト指向プログラミングでは、ポリモーフィズム (ギリシャ語で「複数の形式を持つ」という意味) は、異なるコンテキストで何かに異なる意味や使用法を割り当てることができる特性です。具体的には、変数、関数などのエンティティを許可します。 、または複数のフォームを持つオブジェクト。

2. 2 種類の多型

a) 静的またはコンパイル時のポリモーフィズム

どのメソッドが呼び出されるかは、コンパイル時にのみ決定されます。メソッドのオーバーロードはこの例です。

public class calculation
{
    public int add(int x, int y)
    {
        return x + y;
    }
    public int add(int x, int y, int z)
    {
        return x + y + z;
    }
}

ここでは、同じ名前で署名が異なる 2 つの関数があることがわかります。

b) 動的またはランタイム ポリモーフィズム。

ランタイム ポリモーフィズムは、メソッドのオーバーライドとしても知られています。このメカニズムでは、基本クラスにオーバーライドされたメソッドが含まれている場合、オーバーライドされた関数の呼び出しが実行時に (コンパイル時ではなく) 解決されます。

Class BaseClass
{
Public void show ()
{ 
Console.WriteLine("From base class show method");
}
}
Public Class DynamicDemo : BaseClass
{
Public void show()
{
Console.WriteLine("From Derived Class show method");
}
Public static void main(String args[])
{
DynamicDemo dpd=new DynamicDemo ();
Dpd.show();

}
}
于 2012-12-18T04:31:11.123 に答える
0

ポリモーフィズムの良い例は次のとおりです。

public static void print(Family[] family){
    for(int i=0; i< family.length; i++){
        family[i].FamilyInfo();
    }
}

public static void main(String args[])
{
    Family[] family = new Family[2];
    Grandparents Gp = new Grandparents();
    Parents P1 = new Parents();
    family[0] = Gp;
    family[1] = P1;

    //and then send the array to another method which 
    //doesn't "know" which entry in the array is a parent and which is grandparent
    //and there you can loop the array calling family[i].FamilyInfo();
    //THIS is the whole idea of polymorphism in a nutshell
    print(family);

}
于 2012-12-18T04:17:04.743 に答える
0

多型の辞書的定義は、生物または種が多くの異なる形態または段階を持つことができる生物学の原則を指します

基本的な概念は、特定のオブジェクトが別のオブジェクトのように機能することです。これは、Java でインターフェースと継承を使用することによって実現されます。

これのより良い例は(コードをベースとして)

public class FamilyDemo {
    public static void main(String ary[]) {
        Family gp = new Grandparents();
        Family p1 = new Parents();

        dump(gp);
        dump(p1);
    }

    public static void dump(Family family) {
        family.FamilyInfo();
    }
}

Gradparentsこれにより、基本的にParents、そのまま「行動」することができますFamily

于 2012-12-18T04:19:48.240 に答える
0

はい、あなたのサンプルプログラムでは、継承とポリモーフィズムを使用していますが、実際には両方とも密接に関連しています。

継承を使用しているのは、祖父母クラスから一度ファミリーを拡張し、祖父母を拡張した親クラスを一度拡張し、サブクラスでスーパークラスに記述されたメソッド void を記述しているため、ポリモーフィズムも使用しているためです。FamilyInfo

次のように使用する必要があります@Override

public class Parents extends Grandparents {
    @Override
    void FamilyInfo() {
        System.out.println("The parents are the children of the grandparents and they are the sub sub class for family");
    }
}
于 2014-03-24T00:00:11.407 に答える