2016-05-18 15 views
1

は、私は、宣言に次のようになりますC#でジェネリッククラスがあるとします。空のインターフェイスまたは空の基底クラス

public abstract class DtoQuery<T> where T : class 
{ } 

は、型パラメータは常に「DTO」であることを意図していますクラス。私はこれらの束を持っていますが、 "問題"ははありません。が共通しています。彼らはすべて、(明確な)公共財産の束を持ち、方法はありません。

私のDtoQuery<T>クラスは、そのような "Dto"クラスのみを型パラメータとして受け入れることが理想的です。ですから、空のインターフェイスIDtoを作成するか、空のabstract class Dtoを作成する必要があります。

質問:どちらを使うべきですか?注:Dtoクラスは決して他のものや互いを拡張することはありません!

(私は私が非常にばかげてばかげたものを構築していないことを約束します。これはテストプロジェクトでのユーティリティ機能であり、プロダクションコードには使用されません)。

+1

とにかく空でなければならないので、私はインターフェイスのために行くだろう。しかしそれはあなたにとって重要ではないので(P.S.によると)、何の結果もないでしょうから、どうして尋ねるのですか?これは意見に基づくものではなく、単にサイコロを振るだけです:) –

+0

@RenéVogt私はそれが違いを生む理由を知らないという事実がコミュニティに誰もが知っていることを意味するわけではありません理由。それは何のための質問である、それらではない:)また、*これが生産コードの状況であれば? – MarioDS

+0

扱っているジェネリック型にメソッドやプロパティがない場合、* code *と書くことはできますか? –

答えて

2

のは、あなたが(何らかの理由で)、次のようになります階層があるとしましょう:

public class Person { } 
public class Employee : Person { } 
public class Boss : Person { } 

今、私たちはPersonがDTOとして扱われることを望んでいないことを、想像して - 私たちは、従業員が欲しいですボスはDTOとなる。

この場合、抽象クラスを使用してDTOを表すことはできません。これは、C#の1つの親からしか継承できないためです。

なぜインターフェイスを使用する方が良いのかという客観的な理由です。主観的には、抽象クラスの目的はいくつかの機能を提供することであるため、インターフェースも優れています。それ以外には、インタフェースには何のメリットもありません。

経験則は次のとおりです。わからないときは、常にインターフェイスを使用してください。 にはの実装が必要な場合にのみ抽象クラスを使用してください。

2

私はロブの答え@に同意していますが、私はインターフェイスに向けてあなたを傾けるかもしれないもう一つの理由を追加するつもりだ「DTOクラスは他の何かお互いを延長することはありません」と述べているので:

場合インターフェイスを選択すると、内部に保持することができます。パブリッククラスは内部インターフェイスを実装できますが、内部クラスを拡張することはできません。つまり、あなたのライブラリのコンシューマは、同じ抽象基本クラスを使用して新しいDTO型を作成できなくなります。

これはテストプロジェクトで使用されるため、[assembly: InternalsVisibleToAttribute("Name.Of.Test.Project")]属性を使用してテストアセンブリのみに公開することもできます。

関連する問題