5
interface Shape {
    public double area();  
}

class Circle implements Shape {
      private double radius;

      public Circle(double r){radius = r;}

      public double area(){return Math.PI*radius*radius;}
}

class Square implements Shape {
      private int wid;

      public Square(int w){wid = w;}

      public double area(){return wid *wid;}
}

public class Poly{
     public static void main(String args[]){
               Shape[] s = new Shape[2];
               s[0] = new Circle(10);
               s[1] = new Square(10);

               System.out.println(s[0].getClass().getName());
               System.out.println(s[1].getClass().getName());
      }
}

ポリモーフィズムの概念を理解するために、次の投稿 ( https://stackoverflow.com/a/4605772/112500 ) を見つけましたが、Charlie が実装されていないメソッドを使用して Shape クラスを作成したことに気付きました。

コードからわかるように、そのクラスをインターフェイスに変換し、それを使用して匿名クラスをインスタンス化し、適切なメソッドを呼び出しました。

私の解決策が正しいかどうか誰かに教えてもらえますか? 別の方法でコードを記述しますか? 等号の両側でインターフェイスを使用すると、そのように機能するのはなぜですか?

ありがとう。

ケイトリン

4

3 に答える 3

5

Java の無名クラスは、名前が付けられていないクラスであり、1 つのステートメントで宣言とインスタンス化の両方が行われます。一度だけインスタンス化されるクラスを作成する必要があるときはいつでも、匿名クラスの使用を検討する必要があります。

匿名クラスは、常にインターフェイスを実装するか、抽象クラスを拡張する必要があります。ただし、 extends または implements キーワードを使用して匿名クラスを作成しないでください。代わりに、次の構文を使用して、匿名クラスを宣言およびインスタンス化します。

new interface-or-class-name() { class-body } 

一例は次のとおりです。

Shape s = new Shape() // no square brackets here
{
    public double area()
    {
        return 10.0;
    }
};

投稿されたコードのどこにも匿名クラスを作成していません。

詳細については、Oracle のチュートリアルこれをお読みください。


これを行う場合:

Shape[] s = new Shape[2] // notice the square brackets : "[2]"

Shapeオブジェクトとそのサブタイプへの参照を持つことができる配列を実際に作成しています。したがって、この配列には、以下を実装する任意のクラスのオブジェクトへの参照を含めることができますShape

s[0] = new Circle();
s[1] = new Square();
于 2013-07-18T09:21:57.450 に答える
4

どこでも匿名クラスを使用していませんが、基本的なポリモーフィズムがどのように機能するかを示しています。

一般に、次のようなコードで

Shape s1 = new Circle(2);
Shape s2 = new Square(2);

上記の両方の行は、実際には「円は形です」と「正方形は形です」と言っている形状Circleを実装しているため機能します。Square's1' をタイプとして宣言することによりShape、それが -a であるすべてのものを参照できると言っていますShape。を実装するものShape。インターフェイスで定義されたメソッドは、 および を介してのみ呼び出すことができることに注意してください。次に、Circle にメソッドがあったとします。Shapes1s2diameter

Shape s1 = new Circle(2);
s1.diameter();

diameterインターフェイスに存在しないため、失敗します。変数が参照するインスタンスの実際のクラスではなくShape、変数がどのメソッドを表示できるかを定義するように変数が宣言されています。しかし、呼び出される実装は、参照されるインスタンスの実際のクラスによって決定されます。これがポリモーフィズムの核心です。

于 2013-07-18T09:22:01.817 に答える
4

あなたのアプローチは良いです-具体的な実装(円)ではなく、インターフェース(形状)にプログラミングすることを常にお勧めします。ポリモーフィズムとは、形状のすべての具体的な実装が形状として発生する可能性があることを意味します。

例(疑似Javaに似ています)

Circle c = new Circle(10); // not polymorph, as c = new Square(10) will throw an error

しかし

Shape s = new Circle(10);
... some other code
s = new Square(10) // totaly fine

ファクトリを使用して形状を作成することにより、コードを改善できます。

    public class ShapeFactory {
    public Shape createCircle(int param) { 
return new Circle(param);
}

public Shape createRectangle(int param, int param2) {
return new Rectangle(param, param2) };

and so on

http://en.wikipedia.org/wiki/Factory_method_patternを参照してください

要約すると、あなたは正しい道を進んでいます!

于 2013-07-18T09:20:41.297 に答える