インターフェイス その2
今回の概要
閑話休題、今回はインターフェイスとジェネリッククラスを複合してみようと思います。
前回のプログラムではReaderが取得したファイルなりテーブルのデータを改行で区切った文字列にして返却していましたが、今回はオブジェクトの繰り返しで返却するようにして、1行の内容はオブジェクトのプロパティにセットするように変えてみます。
インターフェイスの変更
前回作成したインターフェイスをまず変更します。
interface IReader { IEnumerable Execute(); } interface IReader<T> { IEnumerable<T> Execute(); }
前回のインターフェイスでは返却値がstringでしたが戻り値をIEnumerableインタフェースとしました。返却値をforeach ~ で取り扱うことができるようにすることで、より現実のプログラムに近くなるようにしておきます。
別のインターフェイスIReader<T>も定義しておきます。名前は同じように見えますが、上で定義しているインターフェイスとは別のインターフェイスです。
こちらは特定の型(T) をIEnumerableで返却するインターフェイスとしておきます。
抽象クラスの作成
DbReader、FileReaderで抽象化可能な部分を抜き出したReaderクラスを作成しておきます。
abstract class Reader<T> { }
interfaceでオブジェクトを列挙して返却するようにExecuteを定義したのでオブジェクト生成関数がほしいのでReaderクラスのコンストラクタ引数に生成関数を追加しておこうと思います。
abstract class Reader<T> { /// <summary> /// 生成関数 /// </summary> private Func<T> creator; /// <summary> /// コンストラクタ /// </summary> /// <param name="creator">オブジェクト生成関数</param> public Reader(Func<T> creator) { this.creator = creator; } /// /// オブジェクト生成 /// /// <returns></returns> protected T CreateObject() { return creator(); } }
コンストラクタの引数で渡ってきた関数をprivate変数に保持しておいて、継承したクラス内部ではCreateObjectメソッドを利用するようにしておきます。
次回
区切りが良いので今回はここまでにします。
次回はリフレクション機能を使ってオブジェクトのプロパティに値をセットするメソッドをReaderクラスに追加していきます。