8

これは、なぜ抽象クラスを持つ方が良いのか、私を悩ませてきました。だから、異なる形状(円、長方形)の面積を計算する必要があるとしましょう。抽象/インターフェイス形状を持ち、それを拡張する Rectangle や Circle などのクラスを使用する方がよいと教えられました。

次のコードを作成しました

abstract class Shape {
    abstract int getArea();
} 

class Rectangle extends Shape{
    private int width;
    private int height;

    public Rectangle (){
        this.width = width;
        this.height = height;
    }

    // get set methods ommited

    public int getArea () {
        return width * height;
    }
}

shape クラスは何の役にも立たないようです。形状が異なれば面積の計算も異なるため、形状クラスで getArea を実装することはできません。形状クラスを削除して、コードを単純にすることができました。

では、抽象/インターフェイス クラスの形状を持つ実際の目的は何でしょうか? 事前に説明をありがとう

4

4 に答える 4

16

shape クラスは何の役にも立たないようです。形状が異なれば面積の計算も異なるため、形状クラスで getArea を実装することはできません。形状クラスを削除して、コードを単純にすることができました。

いくつかの形状 (いくつかの円、いくつかの長方形など) で構成される画像があるとします。これらすべての形状を に格納しList<Shape>、次を使用して総面積を計算できます。

int totalArea = 0;
for (Shape shape : shapes) {
    totalArea += shape.getArea();
}

Shape共通のクラスやインターフェースがなければ、これをどのように行いますか? クラスPictureは、コードをより一般的なものにするために異なる形状クラス間の共通性を使用するのではなく、個々の形状クラスについて知る必要があります。

別の例として、ストリームを考えてみましょう。InputStreamクラスがなく、個々のサブクラスがあっただけだと想像してください。次に、データを読み取らなければならないコードを記述するたびに、各メソッドでコードがまったく同じであっても、処理できるようにしたい個々のサブクラスごとにオーバーロードを提供する必要があります。InputStream違いを抽象化し、共通の機能 (読み取り、スキップなど) を公開します。そうすれば、 を受け取るだけの単一のメソッドを記述し、それを、またはなどInputStreamで呼び出すことができます。メソッドは、どちらを受け取るかを気にする必要はありません。FileInputStreamByteArrayInputStream

于 2013-10-19T08:04:50.723 に答える
7

メソッドに任意の値を渡したい場合は、次のようにShapeします。

public void method(Shape shape) {
   int area = shape.getArea();
}

これをポリモーフィズムと呼びます。抽象クラスまたはインターフェースがない場合、これを行うことはできません。

于 2013-10-19T08:05:02.083 に答える