Pierre からのコメントに従って更新します。
ジェネリック コンバーターを次のように定義します。
public interface IVideoConverter
{
IInputReader Reader {get;set;}
IOutputWriter Writer {get;set;}
void Convert();
}
インターフェイスを定義します。
public interface IInputReader
{
bool IsSUpported(string inputId);
void AppendToBuffer(Buffer buffer);
}
public interface IOutputWriter
{
bool IsSUpported(string outputId);
void WriteFromBuffer(Buffer buffer);
}
コンバーターを実装するクラスを作成します。
public class VideoConverter : IVideoConverter
{
...
}
3つの工場を書く:
public class InputReaderFactory
{
public IInputReader GetReader(string inputId)
{
...
}
}
public class OutputWriterFactory
{
public IOutputWriter GetWriter(string outputId)
{
...
}
}
public class VideoConverterFactory
{
public IVideoConverter GetConverter(string inputId, string outputId)
{
...
}
}
各ファクトリで、ファクトリが担当するインスタンスを構築する任意のメソッドを使用します。VideoConverterFactory はリーダー ファクトリとライター ファクトリを使用する必要があります。
具体的な型の初期化を実装するには、いくつかの方法があります。2について説明します。
a) サポートされているすべてのタイプの静的読み取り専用配列またはリストを作成し、このリストで、指定された入力パラメーターをサポートする最初のコンバーターを検索します。
public class InputReaderFactory
{
private static readonly IEnumerable<IInputReader> SupportedReaders = new IInputReader[] {new Reader1(), new Reader2(),....}
public IInputReader GetReader(string inputId)
{
for(int i=0; i<SupportedReaders .length; i++)
{
if(SupportedReaders [i].IsSupported(inputId)
return SupportedReaders [i];
}
return null;
}
}
b)構成ファイルでサポートされているタイプを定義し(構成要素、構成コレクション、およびそのセクションを実装します)、ファクトリクラスで構成からサポートされているコンバーターを検索し、見つかったらリフレクションを使用してインスタンスを作成します