web-dev-qa-db-ja.com

抽象クラスと具象クラスの違いは何ですか?

サブクラスを作成するためにJava-の抽象クラスが必要な理由を理解しています。しかし、同じことは具体的なクラスによって実現できます。例えばClass ChildはParentを拡張します。 。では、なぜ抽象性があるのですか??

22

抽象クラスは直接インスタンス化できません。クラスを抽象として宣言するということは、インスタンス化されたくないことと、クラスのみを継承できることを意味します。コードにルールを課しています。

親/子関係の例をさらに拡張してPersonクラスを含める場合、Personが抽象的であることは理にかなっています。親は具体的なアイデアであり、子も同様です。人は、コードと同様に、現実の抽象的な概念です。

1つの利点は、明示的に抽象クラスの概念を定義および保護することです。クラスを抽象クラスとして宣言する場合、自分やコードを使用している他の人がインスタンス化することでクラスを誤って使用することはできません。この理由は、関数とフィールドをパブリック、プライベート、または保護として指定する理由と似ています。関数またはメンバーをプライベートとして宣言すると、クライアントコードからの不適切なアクセスから事実上保護されます。プライベートは、クラス内で使用されることを意図しており、それだけです。抽象クラスは継承されることを意図しており、それだけです。

さて、抽象クラスを使用し、関数とフィールドをパブリックではなくプライベートとして定義する必要がありますか? いいえ、あなたはしません。ただし、これらの概念は、コードをきれいに整理するために提供されています。私の知る限り、抽象クラスはすべてのオブジェクト指向言語で実装されています。周りを見ると、C++、C#、VB.NETなどがすべてこの概念を使用していることがわかります。

より良い、具体的な例:

Shape hierarchy UML Diagram

上記の例では、Shapeクラスはそれ自体では役に立たないため、抽象クラスにする必要があります。

50
Paul Sasik

抽象クラスは、完全ではない抽象であることを意味します。それおよび/またはその機能を完了するには別のクラスが必要です。抽象クラスを拡張する必要があります。特定のクラスなどで役立ちます。果物すべての果物は色のような同じ特性を持っています。しかし、オレンジなどの果肉があるか、バナナなどではないかのように、果物ごとに異なる特性を持つことができます。

6
Nitin Chhajer

私はこれが古い質問であることを知っていますが、抽象クラスを使用することの利点についての質問がまだポスターにあったようです。

コードを使用するのがあなただけである場合、実際には利点はありません。ただし、他の人が使用するコードを書いている場合には利点があります。たとえば、キャッシングフレームワークを記述したが、クライアントが独自のキャッシング実装クラスを作成できるようにしたいとします。また、仮想的に開いているキャッシュの数など、いくつかのメトリックを追跡する必要があります。抽象クラスは次のようになります。

public abstract class AbstractCache {
    public final void open() {
        ... // Do something here to log your metrics
        openImpl();
    }

    protected abstract void openImpl() { }
}

AbstractCacheクラス自体は役に立たないので、クライアントがインスタンス化してキャッシュとして使用することをクライアントに望ませたくありません。クラスが具体的であれば、クライアントはそれを実行できます。また、メトリックロギングをバイパスできないことを確認する必要があります。これは、キャッシュインターフェースを提供した場合に可能になります。

4
Mike B

抽象クラスは、他のクラスの派生元となる基本クラスとして使用されることを意図しています。派生クラスは、基本クラスに実装されていないメソッドの実装を提供することが期待されています。欠落しているすべての機能を実装する派生クラスは、具象クラスと呼ばれます

3

抽象化のポイントは、サブクラスを作成することではありません。コード内でSeamsを作成することが重要です。コードをテスト可能で分離し、保守性という究極の目標に導く必要があります。同様の理由で、抽象化により、副作用を波打たずにコードの一部を置き換える機能も購入できます。

3
P.Brian.Mackey

私の理解によると

Abstract Classは、動作を説明するだけで実装しないクラスです。このJavaの例:

public interface DoSomething(){
public void turnOnTheLight(); 
}

Concrete Classesは実装されるものです。例えば:

    public abstract class A(){
        public void doIt(); 
    } 
    public class B extends A(){
        public void doIt(){ 
        //concrete method
        System.out.println(“I am a Concrete Class Test”); 
    }
 }

言い換えると、Javaの具象クラスは、インターフェースまたは抽象クラスのいずれかから継承されたメンバーのすべてを実装したクラスです。

0
Devanshi