中の技術日誌ブログ

C#とC++/CLIと
VBと.NETとWindowsで戯れる
 

目次

Blog 利用状況

ニュース

自己紹介

東京でソフトウェアエンジニアをやっています。
お仕事大募集中です。
記事執筆や、講師依頼とかでも何でもどうぞ(*^_^*)
似顔絵 MSMVPロゴ
MSMVP Visual C# Since 2004/04-2013/03

記事カテゴリ

書庫

日記カテゴリ

00-整理

01-MSMVP

Interfaceという形態をとらないInterfaceの勧め

皆さんはクラスの初期化なんかにどういったアプローチを採用していますか?

クラスの終末処理は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で始まる処理を初期処理としましょう。

内容は各クラス固有の初期処理に必要な引数を取ります。

いろんなところから取ってきたエッセンスを使って私はクラス設計をしています。

皆さんはどうですか?

投稿日時 : 2004年6月20日 20:44

コメントを追加

No comments posted yet.
タイトル
名前
URL
コメント