web-dev-qa-db-ja.com

抽象クラスを使用する方法とタイミング

これはJavaでの私のテストプログラムです。ここでどれだけの抽象クラスが重要であるか、なぜこのために抽象クラスを使用するのかを知りたい。

必須ですか、それとも最良の方法ですか。もしそうならどのように?

class Shape1 {
    int i = 1;
    void draw() {
        System.out.println("this is shape:" + i);
    }
}

class Shape2 {
    int i = 4;
    void draw() {
        System.out.println("this is shape2:" + i);
    }
}


class Shape {
    public static void main(String args[]) {
        Shape1 s1 = new Shape1();
        s1.draw();

        Shape2 s2 = new Shape2();
        s2.draw();
    }
}
34
user568313

ここでは、void draw()メソッドを提供する共通の基本クラス/インターフェイスを作成するために、抽象クラスまたはインターフェイスを使用します。

_abstract class Shape() {
  void draw();
}

class Circle extends Shape {
   void draw() { ... }
}

...

Shape s = new Circle();
s.draw();
_

通常、インターフェイスを使用します。ただし、次の場合は抽象クラスを使用できます。

  1. 共通の機能またはクラスメンバ(例:_int i_メンバ)を提供する必要があります。
  2. 抽象メソッドには、パブリックアクセス(インターフェイスに許可されている唯一のアクセスタイプ)以外のものがあります。私の例では、void draw()にパッケージの可視性があります。
20
Thomas

抽象クラスには、サブクラスと「is-a」タイプの関係があります。したがって、たとえば、任意の形状が持つもの(描画関数など)を持つ抽象クラスShapeを作成し、次にクラスSquareShapeを作成することができます。すべての正方形は形ですが、すべての形が正方形ではありません。

この例では、2つの形状タイプと、これらの2つのインスタンスを持つクラスがあります。これは、abstractと定義する必要がある関係ではありません。

ただし、これはかなり小さな例であるため、自分の名前で何かをしたいと思うかもしれません。ファイルの実際の意味と、それらがどのように機能するかを見ることは困難です。

5
Nanne

javaで抽象クラスを使用するサンプル例。

package use_of_abstract;

abstract class Shapes 
{
   int i=1;

   abstract void draw();
   abstract void color(String mycolor);

   //not an abstract method
   void fill()
   {
      System.out.println("Non-Abstract Method -> Fill"); 
   }

   //not an abstract method
   String anotherMethod(String input) 
   {
       return input + " additional text";
   }

}

package use_of_abstract;

public class Shape_One extends Shapes 
{
    int i=1;

    @Override
    void draw() 
    {
        System.out.println("This is Shape One:"+i);
    }

    @Override
    void color(String mycolor) 
    {
        System.out.println("This is Shape One:"+mycolor);

    }

    @Override
    String anotherMethod(String anotherMethod) 
    {
        System.out.println("This is Shape One:"+anotherMethod);
        return anotherMethod;

    }

}

package use_of_abstract;

public class Shape_Two extends Shapes
{
    int i=2;

    @Override
    void draw() 
    {
        System.out.println("This is Shape Two :"+i);
    }

    @Override
    void color(String mycolor) 
    {
        System.out.println("This is Shape Two Color:"+mycolor);
    }

    @Override
    String anotherMethod(String anotherMethod) 
    {
        System.out.println("This is Shape Two:"+anotherMethod);
        return anotherMethod;

    }

}

package use_of_abstract;

import Java.awt.Color;

public class Shape_Main 
{

    public static void main(String args[])
    {
        Shape_One s1;
        Shape_Two s2;

        s1=new Shape_One();
        s2= new Shape_Two();

        s1.draw();
        s2.draw();

        s1.fill();
        s2.fill();

        s1.color("Blue");
        s2.color("Green");


        s1.anotherMethod("HELLO..............Its Another Method 1");
        s2.anotherMethod("HELLO..............Its Another Method 2");


    }   
}
3

抽象クラスは、少なくとも1つのメソッドが実装されていないクラス、またはキーワード抽象です。たとえば、抽象メソッドは次のようになります。

public abstract String myMethod(String input);

(メソッドがセミコロンで終わることに注意してください。

そして、クラスは次のようになります。

public abstract class MyClass {

    public abstract String myMethod(String input);

    public String anotherMethod(String input) {
        return intput + " additional text";
    }
}

抽象クラスはインスタンス化できません。抽象クラスでは、インスタンス化できるように、欠落している動作を実装するサブクラスが必要です。

抽象クラスの主な目標は、共通の動作の共有実装を提供することです-コードの再利用を促進します。

In Java広く定義された抽象クラスからの継承の代わりにクラスの構成を使用することにより、同じ効果を達成できます。

私のアドバイスは、抽象クラスを厳密に必要な場合にのみ使用し、特にあらゆる種類の機能が満載のトリックバッグとして使用しないようにすることです。

In Scalaでは、これを解決するためのエレガントな方法である特性を使用します。しかし、正しく処理するには多くの注意が必要です。

2

抽象クラスは、その名前が示すとおり抽象です。

抽象クラスは、実装部分について話しません。実際、abstractクラスを拡張して、abstractメソッドの実装を提供します。また、非抽象メソッドを持つこともできます。

ここで確認してください: Javaでの抽象クラスの使用

編集:

サンプルコード:

abstract class Shapes {

 int i=1;
 abstract void draw(); 

 // Remember : Non-abstract methods are also allowed 
 void fill() {
     System.out.println("Non abstract method - fill");
 }
}

class Shape1 extends Shapes {

 int i=1;
 void draw(){
 System.out.println("This is Shape 1:"+i);
 }
}

class Shape2 extends Shapes {
    int i=2;
    void draw() {
        System.out.println("This is Shape 2:"+i);
    }
}

class Shape {

public static void main(String args[])
       {
        Shape1 s1 = new Shape1();
        s1.draw();                     // Prints This is Shape 1:1

        Shape2 s2 = new Shape2();
        s2.draw();                     // Prints This is Shape 2:2
       }
  }
1
sgokhales

一般的なもの+珍しいもの=抽象クラス

いつ使用しますか?

抽象クラスは、何度も何度も書きたくない再利用可能なコードが多数あるシナリオに最適です。+各クラスに固有のことはほとんどありません。

例?

儀式:

一般的なこと:歌う国歌、ホイスト旗など
特定のもの:インドの旗、インドの国歌(インドの場合)、中国の旗、中国の国歌(中国の場合)など。

enter image description here

それの使い方?

1)抽象クラスを作成します
2)一般的なパブリックメソッドにすべてを入れます
3)子クラスに固有の抽象メソッドにすべてを入れます

サンプルコードはどこにありますか?

基本クラス:

public abstract class BaseCeremony{

    Flag natonalFlag;
    Anthem anthem;

    //**** Common Task ******//
    public void startCeremony(){
        configure();
        hoistFlag();
        singAnthem();
    }

    public void hoistFlag(){
        natonalFlag.hoist();                       
    }

    public void singAnthem(){
        anthem.anthem();                       
    }

    private void configure(){
        natonalFlag = provideFlag();
        anthem = provideAnthem();
    }

    //**** Differs in all part ******//
    public abstract Flag provideFlag();
    public abstract Anthem provideAnthem();

}

子クラスでは、珍しい部分の実装を提供するだけです。
ChildClass

public class IndianCeremony extends BaseCeremony{

       public Flag provideFlag(){
            return new IndianFlag();
       }

       public Anthem provideAnthem(){
            return new IndianAnthem();
       }
}

ボーナス

  • 抽象クラスは不完全なクラスであるため、オブジェクトを作成できません。
  • 抽象クラスには、抽象クラスとしての資格を得るために少なくとも1つの抽象メソッドが必要です。
  • Android での抽象クラスの実装例
1
Rohit Singh