これが私がそれについてどのように理由をつけているかです:
ロール/タイプが変更されない場合にのみ継承を使用してください。例えば
次のようなものに継承を使用します。
消防士 ← 従業員 ← 人が間違っています。
消防士の Freddy が転職するか失業するとすぐに、彼を殺し、古いリレーションをすべて付けた新しいタイプの新しいオブジェクトを再作成する必要があります。
したがって、上記の問題に対する単純な解決策は、JobTitle enum プロパティを person クラスに与えることです。ロール/タイプに関連付けられた非常に複雑な動作が必要ない場合など、一部のシナリオではこれで十分です。
より正しい方法は、人物クラスに役割のリストを与えることです。各ロールは、たとえば期間のある雇用を表します。
例えば
freddy.Roles.Add(new Employement( employmentDate, jobTitle ));
またはそれがやり過ぎの場合:
freddy.CurrentEmployment = new Employement( employmentDate, jobTitle );
このようにして、最初にフレディを殺さなくても、フレディは開発者になることができます。
ただし、役職に列挙型または型階層を使用する必要があるかどうかについては、私のすべてのとりとめのない答えがまだありません。
純粋な in mem OO では、ここで役職に継承を使用する方が正しいと思います。
しかし、O/R マッピングを行っている場合、マッパーが各サブタイプを新しいテーブルにマップしようとすると、バックグラウンドで少し複雑すぎるデータ モデルになる可能性があります。したがって、そのような場合、型に関連付けられた実際の/複雑な動作がない場合は、enum アプローチを使用することがよくあります。「if type == JobTitles.Fireman ...」の使用法が制限されていて、物事がより簡単または単純になる場合は、私は一緒に暮らすことができます。
たとえば、.NET の Entity Framework 4 デザイナーは、各サブタイプを新しいテーブルにのみマップできます。また、実際の利点なしにデータベースにクエリを実行すると、醜いモデルや大量の結合が得られる可能性があります。
ただし、タイプ/ロールが静的な場合は継承を使用します。たとえば、製品の場合。
CD <- Product と Book <- Product があるかもしれません。この場合、型に関連付けられた状態が異なる可能性が高いため、ここでは継承が優先されます。CD にはトラック数のプロパティがあり、本にはページ数のプロパティがある場合があります。
要するに、それは依存します;-)
また、最終的には、どちらにしても多くの switch ステートメントが必要になる可能性が高くなります。"Product" を編集したいとしましょう。継承を使用している場合でも、おそらく次のようなコードになるでしょう。
if (製品が本) Response.Redicted("~/EditBook.aspx?id" + product.id);
エンティティ クラスで編集本の URL をエンコードすると、ビジネス エンティティがサイト構造などを認識しなければならないため、見苦しくなります。