2009-06-07 15 views
1

OOPでは、親クラスから派生したクラスが多数ありますが、親クラスは抽象クラスとしてマークされていません。クラスが抽象クラスとしてマークされている場合、どのような利点がありますか?抽象クラスと非抽象クラスから派生する相違点

ありがとうございます。

答えて

0

抽象クラスは単独ではインスタンス化できません。それはインスタンス化するために派生する必要があります。基本的には、クラスの抽象定義は、それ自体がインスタンス化されることを意図したものではなく、そのインスタンスを取得する唯一の方法は、そのクラスを継承し、継承したクラスをインスタンス化することです。

0

コンパイラがインスタンス化を許可しないという事実はありますか?

2

違いは本当にかなり実用的です。抽象基本クラスは、決してインスタンス化されることを意図したものではなく、必ずしも完全な実装を提供する必要はありません。つまり、ABCはのクラスを実装することなく、派生クラスに対してというコントラクトを定義することができます。

これは、2つの方法で便利です:

  • あなたは完全な実装を持っていますが、クラス全体に関するアサーションをしない抽象オブジェクトを定義することができます。これの1つの例は、Circle、Rectangleなどの基本クラスであるdraw()メソッドを持つDrawItemクラスを持つことです。 DrawItem であることがわからないので、それ自体を描画する方法を知ることができませんできません。

  • 具体的な実装が2つあるクラスを定義できます。これはProxyパターンで表示され、例えば、テストのためにオブジェクトをモックするために使用することもできます。

それはインタフェースまたはモジュールミックスインこれらの事についてを定義するための新しい言語のために、これらの日より一般的です。 ABCを使用することは、より直感的な概念のユースケースになることがほとんどです。

1

ポールHaahrのような、interesting suggestionsがあります。具体的なクラス

を(オリジナルを読むサブクラス化しないでください、私はすべてをコピー&ペーストしたくない;-)

のJavaについてのパウロの書き込みが、私は彼のアドバイスの少なくともこの部分は、ほとんどの任意のオブジェクト指向設計のタスクに適用された(実用的、私はまだ時折をコーディングで、それから外れるものの、それは生きているとよく私のデザインにあります;-)、私がC++やPythonなどで実装しようとしているときでさえ、もしPaulの推論を読んだら、彼と同意しているなら、将来抽象クラスをたくさん使うことになります(サブクラス化することができます;-)。私は適切と思われるものの例与える

+0

良いリンク!ありがとうございました。 – dotnetdev

0

public abstract class CustomSocket() 
{ 
    CustomSocket() 
    { 
    } 

    public abstract void PleaseOverideMe(CustomSocketConnection c) 
    { 

    } 

} 
1

「抽象」クラスを呼び出すには、それが不完全だとあなたの仲間のプログラマーと通信するために本質的である:彼らはもう少しを書くことを期待していますそれを利用できるコード。

実際にここで関数型プログラミングの関数の部分的なアプリケーションと平行しています...

+0

それは言っているようです - 私はこれまで遠くに来る - それはあなたに分かります – divinci

+0

今............ – divinci

+0

正確に! (そして今、私はあなたの期間を理解しています。) –

関連する問題