• ベストアンサー

C# クラスのインスタンスについて

クラス(ClassA)を作成した後に別のクラス(ClassB)内でClassAインスタンスを作成したとします。 このインスタンスをさらに別のクラス(ClassC)で使用したいと思うの ですが可能なんでしょうか? 要するに1つのインスタンスを他で使いまわすような事ができないの かなって思っています。 自分で調べると「Singletonパターン」という方法があるようですが 他の方法もあれば知ってみたいと思っています。 ※環境はWinXP、VS2005 C# です。 以上ですが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Xaval
  • ベストアンサー率58% (61/105)
回答No.3

>要するに1つのインスタンスを他で使いまわすような事ができないの かなって思っています。 >自分で調べると「Singletonパターン」という方法があるようですが >他の方法もあれば知ってみたいと思っています。 Singletonパターン[Gamma95] は、単一子インスタンスで、排他制御などをする場合に使います。 一つのクラスでロックフラグを立てたりとかが容易ですよね? 単純にstaticクラスを作らなかったことは正解です。 インスタンスクラスであれば、これからいろんなパターンに派生していきますので。 その他の使い回しのパターンは、Singletonを応用しているものが多いですので、それだけで十分です。 それとも、別にClassAインスタンスは複数作ってもいいが、とりあえずあるところでできたやつを別のところで使う、と言うことでしょうか? 普通に外部からアクセス可能にして、それを使えばよいのですが。。 ちょっと設計的な話になりますが、考え直した方が良いです。 オブジェクト指向の基本原理として ・変更に対してはクローズに ・拡張に対してはオープンに というのがあります。 あるクラス内部で生成したインスタンスが、他で使うと言うことは、 処理や状態的に関連がある場合です。 外部生成したものを突っ込むことはありますが。 無いわけじゃないし、必要に応じてそうなります。詳しいことは知らないので何とも言えませんが、 せっかくデザインパターンに触れたので、すべて見てみてください。 なお、No1,2に補足しますが、VisualStudio2008なら、  public string Name{get; set;} でOKです。

19820202
質問者

お礼

Xaval様 詳しい解説、またオブジェクト指向の考え方も教えていただきありがとうございます。 >とりあえずあるところでできたやつを別のところで使う、と言うことでしょうか? 今回の私のやりたかった処理はこれでした。 >オブジェクト指向の基本原理として >・変更に対してはクローズに >・拡張に対してはオープンに あまり意識はしていなかったのでありがたい情報でした。 今回は本当にありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • sgwjn
  • ベストアンサー率70% (47/67)
回答No.2

#01の方のサンプルで質問の要件は満たしていると思いますが、せっかくC#を使うのですから、SetterとGetterはプロパティを使用した方が良いような気がします。 public string Name {  set  {   this.name = value;  }  get  {   return this.name;  } }

19820202
質問者

お礼

sgwjn様 プロパティは使用するようにします。 まだまだ、C#は経験が浅いので1つ1つの情報がありがたいです。 今回はありがとうございます。

すると、全ての回答が全文表示されます。
  • Splatter
  • ベストアンサー率41% (181/440)
回答No.1

クラスのインスタンスを渡してあげることで、 そのインスタンスを別のクラスで使用することができます。 以下に簡単な例を示します。 ClassA(パラメータとGetter、Setterだけ持つものとします) ------------------------------------------------------ private string name; // 名前 // コンストラクタ public ClassA() { } // 名前を取得する public string getName() { return name; } // 名前を設定する public void setName(string name) { this.name = name; } ------------------------------------------------------ このClassAは内部にnameというパラメータを持ち、 外部からgetName()を実行するとnameの値を返し、 外部からsetName()を実行するとnameの値を記憶します。 ClassB(ClassAのインスタンスを後述のClassCへ渡します) ------------------------------------------------------ // テスト用のメソッド private void Test() { // ClassAのインスタンスを生成する ClassA classA = new ClassA(); // ClassCのメソッドを実行する classA = ClassC.YamadaTarou(classA); // classAのnameの内容を表示する MessageBox.Show(classA.getName()); } ------------------------------------------------------ ClassBではClassAのインスタンスを生成していますね。 この時点ではclassAの中のnameパラメータはnullです。 その後、このclassAをClassCのYamadaTarouメソッドに渡し、 結果として帰ってきたclassAを再び受け取っています。 最後に、classAのnameの値をメッセージ表示させています。 ClassC(classAを受け取り、名前をセットして返します) ------------------------------------------------------ public ClassA YamadaTarou(ClassA classA) { // 受け取ったclassAに、名前をセットします classA.setName("山田太郎"); // 処理結果(classA)を返します return classA; } ------------------------------------------------------ 以上のように、通常の変数と同じようにクラスのインスタンスも 渡すことが可能です。上記例は単純に別クラスで内容のセットを しているだけですが、ここに計算結果を入れたり、パラメータに 応じて以降の処理を分岐したり、といった事にも使えますね。

19820202
質問者

お礼

Splatter様 丁寧な解説本当にありがとうございます。 サンプルを拝見して考え方が理解できました。 >通常の変数と同じようにクラスのインスタンスも渡すことが可能 この扱いがポイントですね。自分のイメージ通りの処理ができました。

すると、全ての回答が全文表示されます。

関連するQ&A