1

次のインターフェースを検討してください。

interface IFile
{
    // Members
};

interface IAudioFile : IFile
{
    // Members
};

interface IVideoFile : IFile
{
    // Members  
};

enum ContentType
{
    Audio,
    Video
};

interface IProvider
{
    HashSet<ContentType> GetSupportedTypes();
    IList<IFile> GetFiles(ContentType contentType);
};

ContentType 列挙は冗長だと思います。列挙型の代わりにインターフェイス識別子のようなものを使用する方法はありますか?

インターフェースの設計に関するコメントは非常に高く評価されます。

4

3 に答える 3

3

それは実際に何を達成しようとしているかによって異なりますが、IProvider がそうであるように、ジェネリックを使用することを検討したい場合があるオプションの 1 つです。

interface IProvider
{
    IList<IFile> GetFiles<T>() where T: IFile;
}

そのように実装することができます

public void ProviderConcrete()
{
    public IList<IFile> GetFiles<T>()
    {
        if(typeof(t) == typeof(IAudioFile))
            .... get Audio files

    }
}

そしてそう呼ばれた

public void Caller()
{
    var files = GetFiles<IAudioFile>();
} 
于 2011-05-16T10:57:38.593 に答える
0

通常は、次のように記述した方がよいでしょう。

void method(IFile file) {
    file.DoYourThing();
}

よりも

void method(ContentType id) {
   switch (id) {
   case ContentType.Audio: 
       file.DoThis();
       break;

   case ContentType.Video: 
       file.DoThat();
       break;
   }
}

これは、通常、スイッチは時間が経つにつれてメンテナンスの悪夢になり、エラーも発生しやすいためです。

switchesまたはチェーンが必要な場合はif-else、既存のクラス階層にメソッドを挿入するか、新しいクラス階層を作成することを検討することをお勧めします。最初のコード スニペットにあるようなコードを書くように努力する必要があります。

いつものように、これは一般的なものであるため、目前の特定の問題には当てはまらない場合があります。

于 2011-05-16T10:58:58.133 に答える
0

ここでのポイントは、返されたリストに「ベース」オブジェクトが含まれていることだと思います。

それが気に入らない場合は、次のようなオーバーロードを作成できます

IList<IAudioFile> GetAudioFiles();
IList<IVideoFile> GetVideoFiles();
于 2011-05-16T10:59:49.950 に答える