ネタモト:http://blogs.wankuma.com/rti/archive/2008/05/12/137324.aspx
Rさんのところで、Overrideで解決してた部分がDelegateでやるように書いてた!と書いてある。
単純化されたパターンだから気になっただけかもしれないけど、個人的にはこういう感じで書いていくかなぁ~と思ったので書いておく。
LoadDataを公開するようにインターフェースILoadableを作成。
public interface ILoadable
{
DataSet DataSet { get; }
void LoadData();
}
んでもって、それを継承する形でクラスを作成。
public class LoadableImpl : ILoadable
{
public DataSet DataSet { get; set; }
public Func<BaseTableAdapter> GetTableAdapter { get; set; }
public void LoadData()
{
using (var a = GetTableAdapter()) a.Fill(this.DataSet);
}
}
後は、AAA用 BBB用 CCC用のインスタンス作るクラスを作って完成。
public class Factory
{
public ILoadable CreateAAA()
{
return new LoadableImpl
{
GetTableAdapter = () => new AAATableAdapter()
};
}
public ILoadable CreateBBB()
{
return new LoadableImpl
{
GetTableAdapter = () => new BBBTableAdapter()
};
}
public ILoadable CreateCCC()
{
return new LoadableImpl
{
GetTableAdapter = () => new CCCTableAdapter()
};
}
}
ということで、書いてる途中で思った。Gushwellさんがコメントに書いてあるコレでいいじゃんって。
public class Base<T> where T : BaseTableAdapter, new() {
public void LoadData() {
using (var a = new T())
a.Fill(this.dataSet);
}
}
ということで、このエントリ書くのやめようかと思ったけど、書いちゃったので投稿。
ついでにいうと、これしきのことにインターフェースなんて…って思ってしまう部分も大いにある。
ここらへんのさじ加減は、何度も失敗して覚えていくのだろう。