2009-03-01 11 views
0

私はC#のsealedキーワードを読んでいました。私は標準ライブラリから継承した最後のことを思い出しません。 C++では、いくつかの型をtypedefし、いくつかのパラメータを使用するstdインタフェースを継承していることを覚えています。しかし、それは1)簡単な2)インターフェイス重要なクラスを継承するケース?

私の頭の上から、私はそれが継承されることを期待している仮想関数を持っていない継承クラスを覚えていない。誰もあなたがインターフェイスではなかった些細なクラスを継承する必要がある状況を教えてもらえますか?

仮想関数を持たない限り、クラスを継承しないように親指を当てるのも良いルールだと言えます。これは大雑把なルールですか?

注:演算子SomeClassを使用します。& SomeClass(){return m_someClass; }私は別のクラスとして私のオブジェクトを渡す必要がある場合。それはうまくいく。

答えて

0

実際にC++で使用されていますが、継承の継承ではありません(例:インプリメンテーション、mixins、boost :: noncopyableを継承し、そこからクラスを継承し、演算子をいくつかのクラスから継承し、クラスにいくつかの演算子を追加します)。また、C++型でメタプログラミングを行う場合、別の型を継承するのが最も簡単な型の作成方法の1つです。

仮想関数を持たず、インターフェイスの「種類」として機能するクラスから継承するもう1つのケースは静的多型(CRTPのConcreteA:BaseAクラスなどのテクニック)です。コンパイル時にすべてが解決されるため、仮想関数は必要ありません。

しかし、クラスをランタイムで多面的に扱うには、実際に少なくとも1つのメソッドを仮想化して、それをデストラクタにする必要があります。例外はありますが、まれです。

多態性の階層を持つ場合でも、具体的なクラスから派生することがあります。 1つの例は、TextEditから派生したSingleLineEditです。しかし、これは少し危険です。親クラスのカプセル化が解除されるためです(例えば、そのメソッドは実装の詳細を期待するかもしれませんし、サブクラスでそれらを尊重して保持する必要があります。以下のバージョンで予告なしに変更するなど)

0

私は、オブジェクト指向プログラミングの重要な概念は多形性であると主張します。特定のクラスを継承しても多型を利用できない場合、継承のポイントは何ですか?したがって、オーバーライドするメソッドがない場合は、サブクラス化しないでください。あなたはコードの複雑さを増やすだけです。同じ機能をたくさん使いたい場合は、既存のクラスを自分でラップするだけです。

+0

OODの重要な概念は、データと機能が一緒に収集され、モデル化対象を表すオブジェクトを形成することです。多態性は、その概念の拡張であり、それ以上のものはありません。 –

+0

OOPの重要な概念は、誰もそれが何であるかについて同意できないということです。多態性はその概念を拡張したものとして、データと機能を一緒に集めてオブジェクトを形成することなく、多形性を持つことができると思います。 –

+0

それにもかかわらず、継承の主な目的は、実世界のオブジェクトを表現するのではなく、多形性を促進することです(実際のオブジェクトをモデル化するためにOOPを使用することがどうして効果がないかを見るためにLiskov Substitution Principleを見てください)。 – Smashery