オブジェクト指向システムで、クラスではなく(Cスタイルの)構造体を選択するとしたら、どこを選択すればよいでしょうか。


9

Cおよび他の多くの言語では、struct構造(または同様の方法)を作成するためのキーワードが提供されています。これらは(少なくともCでは)クラスのような単純化された観点からですが、ポリモーフィズム、継承、メソッドなどはありません。

Cスタイルの構造体を持つオブジェクト指向(またはマルチパラダイム)言語を考えてみてください。クラスではなく、どこで選びますか?現在、クラスはOOPでそれらの目的を置き換えるように見えるので、それらがOOPで使用されるとは思われませんが、オブジェクト指向プログラムのクラスよりも優先される可能性のある状況や、どのような状況にあるのでしょうか。そのような状況はありますか?


どの言語を使用していますか?何を公開していますか?Javaを除くほとんどの最近のOO言語は、何らかの方法でプロパティをサポートしています。
ケビンクライン

回答:


16

いくつかの本で、ステートキャリーオブジェクトと機能性オブジェクトを区別しています。正確な用語はソースによって異なります。しかし一般的に言えば、前者は一連のフィールドと一連の単純なゲッターとセッターのペア(そしておそらくコンストラクター)を持つことで区別されます。

これらは、「シリアライズ可能」として明示的にマークされているクラスのJavaで特に一般的です。

メンバーを直接非表示にする必要がないと感じる場合(たとえば、ネストされた型の場合)、この種のクラスは構造体として最も意味があると私は主張します。


1
Robert C MartinはそれらをClean Codeでは「データ転送オブジェクト」と呼んでいます。
user16764 2012年

5

Cにはクラスがないためstruct、データをバンドルする方法があります。C ++では、structと同じですが、class継承とメンバーアクセスがpublicデフォルトではなくですprivate。C#にも一種のがありますがstruct、コメントするのに十分なC#がわかりません。Common Lispのdefstruct形式はCと同じように機能しstruct、言語の違いを考慮して、Common Lispオブジェクトシステムクラスとは異なります。

ただし、関連するデータのバンドルと実際のクラスとの間には概念的な違いがあり、C ++ではstruct多くの場合、データのバンドルにclass使用されますが、独自の動作を持つはずのオブジェクトに使用されます。ガイドラインclassとして、aはクラス不変式など、便利なものを表すことができるものを表しますが、a structは他のデータにあまり依存しないデータ値とより緩く結合されます。


6
a structとa の違いclassはC#でより重要です-重要なのstructは、aが値型であり、a classが参照型であることです。struct内容が16バイト以上になる場合は、aを使用しないことをお勧めします。
Carson63000 2011年

0

非常に基本的なレベルで、構造体と純粋なデータクラス(プロパティアクセサー以外に機能を持たないクラス)の違いは何ですか?

本当にメモリのフットプリントに他なりません。


0

受け入れられた答えは良いです。追加したい...

クラス内にメソッドを置く方が良い場合もあります。また、(OOPスタイルを使用している場合でも)構造体/クラスがパラメーターとして渡される外部関数を使用する方が良い場合もあります。

クラス内にメソッドを配置するタイミングの例:Rectangle.CaclulateArea()

関数をクラス外に配置する例:Canvas.Draw(Rectangle rect)

あなたは長方形の中にDraw()を置くことができ、それはうまくいくでしょう。ただし、描画は層に依存する操作です。サーバー側ではなく、クライアント側で描画します。Draw()はサーバー上に存在しても意味がありません。ただし、「CalculateArea()」は階層に依存せず、四角形の真の属性であるため、メンバーメソッドとして含めることをお勧めします。


0

私にとって大きな違いは、クラス不変式があるかどうかです。

または言い換えると、任意の時点で任意のフィールドを任意の値に自由に変更できますか?もしそうなら、それは構造体です。そうでなければ、それはクラスです。

構造体の通常の例は、XメンバーとYメンバーのみを持つ2Dポイントであり、任意の値を持つことができ、互いに完全に独立しています。パブリックアクセスは許容されます。

クラスの例は、文字配列へのポインターと長さフィールドの組み合わせです。長さはポインターの値に依存するため、構造体であってはなりません。フィールドはプライベートである必要があり、クラスの不変を保証するためにアクセスはセッターとゲッターを通過する必要があります。


0

1)ネットワークstructs:ネットワーク上で送信される構造。

より一般的かつ正式には、POD、ささいな、標準的なレイアウト、または関連する概念である必要があるクラス。これらの概念の優れた説明と例については、この回答を参照してください(C ++ 11用です)。

2)ファンクタ(特に述語)std::remove_if。のような関数に渡されます。別の言い方をすれば、クラスは/から継承されstd::binary_functionたものと類似しています。

3)メタプログラミングの概念。パブリックconstexprsやs のみを含む場合がありますtypedef

編集:注:この回答はC ++クラスと構造体に適用されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.