-1

重複の可能性:
継承よりも構成を優先しますか?

最近何度か出くわした一般的な質問: 含むこととは対照的に、派生することの利点と欠点は何ですか?

もう少し詳しく言うと:

class A : public std::vector<int> {};

また

class B {public: std::vector<int> elem;}

?

もちろん、プロダクション コードではelem、プライベートとして宣言し、パブリックのゲッターとセッターを実装します。

一般的な推奨事項はありますか?

4

5 に答える 5

3

一般的な推奨事項は、標準ライブラリ コンテナーから派生させないことです。この質問の回答も参照してください。

この質問に対する最初の回答は、リスコフの置換原理に関するメモです。これがあなたの回答になる可能性があります。

代用可能性は、オブジェクト指向プログラミングの原則です。コンピュータプログラムでは、S が T のサブタイプである場合、型 T のオブジェクトは型 S のオブジェクトに置き換えることができる (つまり、型 S のオブジェクトは型 T のオブジェクトに置き換えることができる) と述べています。そのプログラムの望ましい特性 (正確さ、実行されたタスクなど)。

于 2012-07-10T07:56:05.590 に答える
1

合成はhas-a関係を意味し、継承はis-a関係を意味します。

関係をよりよく反映するものを選択する必要がありますが、一般的には を使用することをお勧めしますcomposition

このウィキペディアのページでは、いくつかの説明が提供されました。

ここにも同様のSO の質問があります。

于 2012-07-10T08:02:14.247 に答える
0

クライアントへの結合を最小限に抑えるよう常に努力してください。公開するエンティティが多いほど、ライブラリにバインドできるクライアント コードが複雑になり、将来の変更を提供して依存関係を解消することが難しくなります。

また、通常、基本クラスとして意図されていない標準ライブラリ コンテナーから派生することはありません。


関連する参考文献:

于 2012-07-10T07:56:42.917 に答える
0

現在のタスク、ニーズ、要件などに応じて選択する必要があります。

あなたが言った質問は一般化されすぎています。ただし、通常、std クラスから派生させることはお勧めできません。

また、これを確認してください。

于 2012-07-10T07:56:50.750 に答える
0

この質問がstlクラスからの派生に関連しているかどうかはわかりませんが、クラスが関連しており、完全な意味がある場合は、一般的に派生に行きます.Car、engine、およびHybrid Carのクラスの例を見てください

ハイブリッドカーは、車とエンジンが車内にあることに由来する (封じ込め) 方が理にかなっています。継承の場合、強力な仮想機能を利用できます。

Open-Close の原則に従いたい場合は、通常、継承が使用されます。

于 2012-07-10T07:57:19.493 に答える