皆さんはクラスの初期化なんかにどういったアプローチを採用していますか?
クラスの終末処理はIDisposable.Disposeというものが用意されていますが、初期処理にこれというものは用意されていません。
初期処理はクラスによって千差万別だからです。
話はちょっと変わりますが、ICloneableだとか、IComparable、IComparerなどは一般化させるために、引数などにobjectを取るようになってしまっています。
ここであげたIComparable, IcomparerはVisual Studio 2005でが使えるようになるので、ある程度解決です。
public class TestStub : IComparer
{
#region IComparer Members
public int Compare(TestStub x, TestStub y)
{
throw new global::System.NotImplementedException();
}
public bool Equals(TestStub x, TestStub y)
{
throw new NotImplementedException();
}
public int GetHashCode(TestStub obj)
{
throw new NotImplementedException();
}
#endregion
}
これと同じ構文をまねしておくことをお勧めします。
ただしICloneableと初期化処理にはいい解決策がありません。
ICloneableには、DeepCopy とか ShallowCopyの問題もあるので、お勧めは
public class A
{
private string _text;
public A Copy()
{
A retval = new A();
retval._text = this._text;
return retval;
}
}
などのCopyという名前を使うメソッドを実装することです。
CopyDeep, CopyShallowなど使い分けも可能ですし、CloneといってもCloneではありえないためCopyの方が適切です。
それらと一緒で初期処理は
public class A
{
private string _text;
public A Init(string Text)
{
this._text = Text;
}
}
といったInitで始まる処理を初期処理としましょう。
内容は各クラス固有の初期処理に必要な引数を取ります。
いろんなところから取ってきたエッセンスを使って私はクラス設計をしています。
皆さんはどうですか?