8

最初に通常のクラスを使用して一般化された概念を実装し、次にサブクラスを使用して特殊化したこのサンプル コードを検討してください。

package check;
class figure{
  void area(){
  System.out.println("\n Superclass for any figure"); //An useless print statement
  }
}

class triangle extends figure{
  void area()
  {
    System.out.println("\n Code to determine area of a triangle");
  }
}

抽象クラスを使用した同じ実装の場合、コードは次のようになります。

abstract class figure1{
  abstract void area();
}

class triangle1 extends figure1{
  void area()
  {
    System.out.println("\n Code to determine area of a triangle");
  }
}

JAVA の私の教科書 (Herbert Schildt 著、完全なリファレンス、第 7 版) を読んでいると、一般化と専門化のアプローチの場合、何らかの方法で抽象クラスを使用する方が優れていることを筆者が伝えたいと考えているように見えました。しかし、通常のクラスを使用するよりも優れていることを理解できませんでした。抽象クラスを使用すると、基本的に基本クラスを拡張する必要があり、それだけです。それ以外は、実装に大きな違いは見られません。では、抽象クラスを使用することが、通常のクラスを使用するよりも優れたプラクティス/アプローチであることを理解してもらえますか?

4

7 に答える 7

11

抽象クラスはインスタンス化できません。これが抽象クラスの真の利点です。

たとえば、クラスAnimalは抽象クラスである可能性があります。しかし、実際にはAnimal;のインスタンスを持つことはできません。動物を作成するだけでは意味がありません。現実世界のエンティティであるため、実際にはCatまたはなどの動物を作成します。Dogしたがって、コード設計と現実世界の概念または状況との間の変換に関しては、抽象クラスは現実世界の状況をより適切に描写できるため、はるかに優れています。

于 2013-11-08T18:03:27.340 に答える
8

「良い」も「悪い」もありません。目的次第です。

子クラス自体が抽象クラスでない場合、抽象クラスを使用すると、子クラスによって実装する必要がある抽象メソッドを宣言できます。

非抽象はそうではありません。宣言されたすべてのメソッドを実装する必要があります。

抽象クラスを「一般的な」オブジェクトと考えてください。これは、実際には存在しませんが、他の多くの具体的なオブジェクトに適切な一般化を提供します。

非抽象クラスは、実生活で実際に指を向けることができるものと考えてください。

于 2013-11-08T18:03:58.537 に答える
7

抽象メソッドを使用すると、誰もクラスをインスタンス化できなくなります。

つまり、誰も Shape を作成してそれを使用することはできません。Circle や Rectangle など、形状を拡張するものを作成する必要があります。

于 2013-11-08T18:01:23.447 に答える
1

他の人が指摘したことに加えて、抽象クラスを持つことのもう1つの利点は、必要に応じてサブクラスを追加できることです。Shape抽象クラスとCircleおよびクラスがTriangle concreteあるとします。将来必要になったPolygon場合は、簡単に追加できます。

クラスをabstract高レベルのエンティティとして、concreteクラスをエンティティのより多くのspecialized形式として、genericジェネリック クラスのすべてのプロパティを継承し、ジェネリック クラスとは異なる独自の動作を定義する特殊なクラスを使用します。

于 2013-11-08T18:09:30.980 に答える
0

メソッドに関するEffective Javaのディレクティブも参照してくださいequals()。継承関係に 2 つの具象クラスがある場合、コントラクトを尊重する方法でそのメソッドを実装することは、まったく不可能ではないにしても注意が必要です。

于 2013-11-08T18:05:07.797 に答える
0

抽象クラスを使用すると、基本的に基本クラスを拡張する必要があり、それだけです。それ以外は、実装に大きな違いは見られません。では、抽象クラスを使用することが、通常のクラスを使用するよりも優れたプラクティス/アプローチであることを理解してもらえますか?

抽象クラスは、インターフェイスと同じ目的を果たします。それは、そのインスタンスがあれば、これらのメソッドが使用可能になることを知っているという機能的なコントラクトを作成します。抽象クラスの追加の利点は、サブクラスでメソッドを実装する必要なく、サブクラスが共有するメソッドの実装を含めることができることです。

 public abstract class AbstractFoo{
    public abstract void process(); // subclasses forced to implement
    public String getValue(Object b){
         String s = "Hi!!";
         // stuff happens....maybe
         return s;
 }

 public class ConcreteFoo extends AbstractFoo{
     public void process(){
         // you forced me to!! Oh well, I want to honor the contract
         // anyway
     }
 }

 public class Main{
     public static void main(String[] args){
        AbstractFoo f = new ConcreteFoo();
        System.out.println(f.getValue(new Object()));
     }
 }

これは与える

 Hi!!

出力として。通知ConcreteFooを実装する必要はありませんでしたgetValue

于 2013-11-08T18:23:29.483 に答える