-1

だから私はこのコードを持っています:

https://gist.github.com/anonymous/0760d154f81064bf8493 (5クラスなので載せきれなくてすみません)

そして、ポリモーフィズムをかなりの程度実装したと思います。しかし、さらにポリモーフィックにするために他にできることはありますか?

また、メインクラスでローカル変数をこんな風に作っていました(shape,shape1,shape2,area,area1,area2) 継承か何かでやらなきゃいけなかったような気がします。それが正しくないように見えるかどうかはわかりません。

ありがとう

4

4 に答える 4

1

あなたがしたことは本当に何も悪いことではありません。Shape1/Shape2 などは、「Shape」のインスタンスを格納するために使用したプライベート変数にすぎません。これは通常のことです...

これは宿題だと思います。スーパークラスからメソッドをオーバーライドすることを理解していることを示しましたが、すべてを試したい場合は、「Shape」を共通のメソッド定義を持つインターフェイスにすると、Square/Triangle などを作成できます。 Shape インターフェイスを実装する必要があります。次に、「MyShapes」でそれらをインスタンス化すると、次のように作成されます。

Shape t = new Triangle();

そうすれば、「tは Shape インターフェースを実装するオブジェクトのインスタンスであり、実際に何であるかを気にする必要はありません。tそれが Shape の契約を満たしていることがわかっているからです」

于 2013-10-23T13:53:10.790 に答える
1

ポリモーフィズムは問題を解決するツールではありません。必要に応じて従うべきパラダイムです。

とはいえ、問題は次のとおりです。よりポリモーフィックにする必要があるのは何ですか? あなたの変化から得られるものはありますか?要件はありますか?アーカイブしようとしている目標は何ですか?

これらの質問に答えると、変更が必要な場合に、コードの何を変更する必要があるかがわかります。

于 2013-10-23T13:44:51.760 に答える
1

私はそのようにMyShapesを変更します

import java.util.Scanner;


public class MyShapes 
{
    public static Scanner scan = new Scanner(System.in);

    public static int Menu()
    {
        System.out.println("\nSelect a Shape or Exit: \n");
        System.out.println("1. Square");
        System.out.println("2. Circle");
        System.out.println("3. Triangle");
        System.out.println("4. Exit");

        System.out.println("\nEnter choice:");
        int option = scan.nextInt();

        return option;
    }// end menu

    public static void main(String[] args) 
    {       
        int option = 0;

        while (option != 4)
        {
            option = Menu();

            Shape shape = null; 

            switch(option)
            {
                case 1:
                    shape = new Circle(scan.nextDouble());
                    break;

                case 2:
                    Shape shape = new Square(scan.nextDouble());
                    break;
                case 3:
                    shape = new Triangle(scan.nextDouble());
                    break;

                case 4:
                    System.out.println("System closing");
                    System.out.println("-----------\n");
                    //System.exit(0);   <-- not needed
                    break;
                default:
                    System.out.println("Invalid option");
                    System.out.println("--------------\n");
            }
            printShape(shape); //check null needed.
        }
    }

    private void printShape(Shape shape){
        if(shape != null){
            double boundaryLength1 = shape.getBoundaryLength();
            double area1 = shape.getArea();
            System.out.println("Boundary Length = " + Math.round(boundaryLength1));
            System.out.println("Area = " + Math.round(area1));
        }
    }
}

そして、MyShapes クラスではなく、各オブジェクト内にそのプリントを配置することをお勧めします。

別のこと、 System.exit() は良い習慣ではありません。 System.exit() を必要とせずに Exit オプションが選択されている場合、コードは終了します。その行を削除するだけです。


工場

継承よりも高度なトピックは、parameterファクトリを使用することが好まれるオブジェクトに依存するオブジェクトを作成する場合の設計パターンです。

public class ShapeFactory{

    public static Shape createShape(int option){
        //Your switch here.
    }
}

MyShapes クラスは次のように変更されます

import java.util.Scanner;


public class MyShapes 
{
    public static Scanner scan = new Scanner(System.in);

    public static int Menu()
    {
        System.out.println("\nSelect a Shape or Exit: \n");
        System.out.println("1. Square");
        System.out.println("2. Circle");
        System.out.println("3. Triangle");
        System.out.println("4. Exit");

        System.out.println("\nEnter choice:");
        int option = scan.nextInt();

        return option;
    }// end menu

    public static void main(String[] args) 
    {       
        int option = 0;

        while (option != 4)
        {
            option = Menu();

            Shape shape = ShapeFactory.createShape(option); 
            printShape(shape); //check null needed.
        }
    }

    private void printShape(Shape shape){
        if(shape != null){
            double boundaryLength1 = shape.getBoundaryLength();
            double area1 = shape.getArea();
            System.out.println("Boundary Length = " + Math.round(boundaryLength1));
            System.out.println("Area = " + Math.round(area1));
        }
    }
}
于 2013-10-23T13:47:32.440 に答える