クラス(ClassA)を作成した後に別のクラス(ClassB)内でClassAインスタンスを作成したとします。
このインスタンスをさらに別のクラス(ClassC)で使用したいと思うの
ですが可能なんでしょうか?
要するに1つのインスタンスを他で使いまわすような事ができないの
かなって思っています。
自分で調べると「Singletonパターン」という方法があるようですが
他の方法もあれば知ってみたいと思っています。
※環境はWinXP、VS2005 C# です。
以上ですが、よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
>要するに1つのインスタンスを他で使いまわすような事ができないの
かなって思っています。
>自分で調べると「Singletonパターン」という方法があるようですが
>他の方法もあれば知ってみたいと思っています。
Singletonパターン[Gamma95] は、単一子インスタンスで、排他制御などをする場合に使います。
一つのクラスでロックフラグを立てたりとかが容易ですよね?
単純にstaticクラスを作らなかったことは正解です。
インスタンスクラスであれば、これからいろんなパターンに派生していきますので。
その他の使い回しのパターンは、Singletonを応用しているものが多いですので、それだけで十分です。
それとも、別にClassAインスタンスは複数作ってもいいが、とりあえずあるところでできたやつを別のところで使う、と言うことでしょうか?
普通に外部からアクセス可能にして、それを使えばよいのですが。。
ちょっと設計的な話になりますが、考え直した方が良いです。
オブジェクト指向の基本原理として
・変更に対してはクローズに
・拡張に対してはオープンに
というのがあります。
あるクラス内部で生成したインスタンスが、他で使うと言うことは、
処理や状態的に関連がある場合です。
外部生成したものを突っ込むことはありますが。
無いわけじゃないし、必要に応じてそうなります。詳しいことは知らないので何とも言えませんが、
せっかくデザインパターンに触れたので、すべて見てみてください。
なお、No1,2に補足しますが、VisualStudio2008なら、
public string Name{get; set;}
でOKです。
Xaval様
詳しい解説、またオブジェクト指向の考え方も教えていただきありがとうございます。
>とりあえずあるところでできたやつを別のところで使う、と言うことでしょうか?
今回の私のやりたかった処理はこれでした。
>オブジェクト指向の基本原理として
>・変更に対してはクローズに
>・拡張に対してはオープンに
あまり意識はしていなかったのでありがたい情報でした。
今回は本当にありがとうございました。
No.2
- 回答日時:
#01の方のサンプルで質問の要件は満たしていると思いますが、せっかくC#を使うのですから、SetterとGetterはプロパティを使用した方が良いような気がします。
public string Name
{
set
{
this.name = value;
}
get
{
return this.name;
}
}
sgwjn様
プロパティは使用するようにします。
まだまだ、C#は経験が浅いので1つ1つの情報がありがたいです。
今回はありがとうございます。
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;
}
------------------------------------------------------
以上のように、通常の変数と同じようにクラスのインスタンスも
渡すことが可能です。上記例は単純に別クラスで内容のセットを
しているだけですが、ここに計算結果を入れたり、パラメータに
応じて以降の処理を分岐したり、といった事にも使えますね。
Splatter様
丁寧な解説本当にありがとうございます。
サンプルを拝見して考え方が理解できました。
>通常の変数と同じようにクラスのインスタンスも渡すことが可能
この扱いがポイントですね。自分のイメージ通りの処理ができました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/17 18:41
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- その他(プログラミング・Web制作) どういうプログラムで組みますか?google colabでやってるんですけど、出来る方お願いします。 1 2022/07/06 09:28
- その他(プログラミング・Web制作) このプログラミングをどう組みますか? Googlecolabでやってるんですが、出来る方お願いします 1 2022/07/13 10:52
- Excel(エクセル) 別インスタンスのエクセルを制御したい 1 2023/05/10 02:03
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/05/21 02:41
- MySQL AWSのRDSを無料枠で使用しておりますが、2日前にDBインスタンスを作成し、現在確認したらDBイン 1 2022/07/19 23:49
- Java インスタンス ダウンキャストについて以下の解釈であっているか教えて欲しいです。 サブクラスをスーパー 1 2022/03/27 18:53
- Java 複数TBLのオブジェクトを1つの変数(オブジェクト)でまとめて管理したい 1 2022/12/17 00:12
- その他(SNS・コミュニケーションサービス) 大至急お助け下さい。マストドンの或るインスタンスに登録したいのですが、ユーザー名で半角英数とアンダー 1 2023/08/25 10:33
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
インスタンス参照でアクセスで...
-
変数名の付け方
-
VB.NET getとsetの概念がわかり...
-
private static という変数の修飾
-
C#において、同じインスタンス...
-
C# インスタンスの破棄
-
複数の変数を宣言する時、同時...
-
メソッドの引数としてのthisの意味
-
オブジェクト参照がオブジェク...
-
生成したインスタンスを削除す...
-
VC++コンソールアプリでのイン...
-
フォームの存在をチェックする方法
-
staticメソッドにするかどうか...
-
インスタンス生成で、○○.xxx();...
-
SQLを連続発行する時の正しい(?...
-
データベースから日付型を取得...
-
VB6.0で、DLLを動的に参照したい
-
文字列を日付に変換でParseExce...
-
CFrameWnd とCFormView
-
(C++) for文内でのインスタンス...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
変数名の付け方
-
インスタンス参照でアクセスで...
-
private static という変数の修飾
-
複数の変数を宣言する時、同時...
-
VB.NET getとsetの概念がわかり...
-
生成したインスタンスを削除す...
-
C# インスタンスの破棄
-
C#において、同じインスタンス...
-
「インスタンス」の意味をわか...
-
変数の参照でエラーが出てしま...
-
SQLを連続発行する時の正しい(?...
-
オブジェクト参照がオブジェク...
-
文字列を日付に変換でParseExce...
-
VB6.0で、DLLを動的に参照したい
-
javaのクラスの作り方、エラー...
-
インスタンスを同じ名前で作成...
-
エクセル(複数インスタンス)...
-
フォームの存在をチェックする方法
-
C#「オブジェクト参照が必要で...
-
newしないインスタンス?実体化...
おすすめ情報