質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

3回答

11293閲覧

C#でクラスのメソッドから親?クラスのフィールドに値を格納したい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2016/11/24 08:28

編集2016/11/24 08:29

ClassAのフィールド値ValAをClassBのメソッドから値をsetできるでしょうか?

C#

1class ClassA { 2 public ClassB ClB {get; set;} 3 public int ValA {get; set;} // ★ClassBのSetClassAvalueメソッドから値をsetしたい 4} 5 6class ClassB { 7 public void SetClassAvalue(int value){ 8 // ★ここからvalueの値をsetしたい 9 } 10}

ちょっと意味不明かもしれませんが、

c#

1ClassA clA = new ClassA(); 2clA.ClB.SetClaassAvalue(3);

を実行するとclA.ValAに3が格納されるようにしたいのです。

どうぞよろしくお願い致します。

開発環境:Windows10 VS2015 C# .NetFramework4.5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

その設計がおかしいです。
ClassAにClassBを継承させてパラメータを保持するか、
ClassAを経由してClassBにアクセスするのが良いです。

どうしてもしたければSetClaassAvalueにClassAのオブジェクトを渡すしかないのでは?
リフレクションする意味も分かりませんし。。。

投稿2016/11/24 08:45

himakuma

総合スコア952

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/24 08:49

ありがとうございます! たしかになんとなく設計がおかしい気がしていました・・・。 こんなふうな使い方もできるのかな?という疑問から質問させていただきましたがやはりおかしかったのですね。
himakuma

2016/11/24 08:55

プロパティにしている意味がなくなりますし。。。
himakuma

2016/11/24 09:00

やりたい内容しだいですが、ClassA、ClassBを持つClassCを作ってもいいかもですね
退会済みユーザー

退会済みユーザー

2016/11/24 09:49

ありがとうございます! そうですね、ちょっと設計を見直そうかと思います。 ClassCを作ると全般的に変えないといけなくなるので・・・。
himakuma

2016/11/24 10:33

ishi9さんにコメントした内容を見ると平均値を算出する共通の継承クラスを作った方が良い気がしますが?
himakuma

2016/11/24 10:36

拡張メソッドを使っても良いかもです。(速度を求めるならやめた方が良いです) もしかしてUnityですか??
退会済みユーザー

退会済みユーザー

2016/11/24 10:51

再度ありがとうございます! >平均値を算出する共通の継承クラスを作った方が良い気がしますが? うう・・すみません、そもそも設計を変える前提なのですよね。 やはり最初にご回答いただいた「ClassAを経由してClassBにアクセスするのが良いです。」がシンプルで良いような気がしています。 あとUnityではないです。
himakuma

2016/11/25 00:44

ClassAをstaticで保持は駄目ですよね?
退会済みユーザー

退会済みユーザー

2016/11/25 04:58

今のところそうですね・・・。
guest

0

こんにちは。

他の方たちがおっしゃっているようにやりたいことをもう少し整理されたほうが良いとは思います。
とりあえず実現には子から親へ変更イベントを起こすのが簡単だと思います。

csharp

1class ClassA 2{ 3 public ClassB ClB { get; set; } 4 public int ValA { get; set; } // ★ClassBのSetClassAvalueメソッドから値をsetしたい 5 6 public ClassA() 7 { 8 ClB = new ClassB(); 9 ClB.SetAvalue += (value) => 10 { 11 ValA = value; 12 }; 13 } 14} 15 16class ClassB 17{ 18 public event Action<int> SetAvalue; 19 public void SetClassAvalue(int value) 20 { 21 // ★ここからvalueの値をsetしたい 22 this.SetAvalue?.Invoke(value); 23 } 24}

投稿2016/11/24 15:31

Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/25 05:05

ありがとうございます! とりあえず質問内容からいえばイベント発生が簡単なんですね! まずは設計を見直してみて勉強としてイベントもやってみようと思います。
guest

0

その例だけだと、下記のように書けばいいのでは?で話が終わってしまいます。

C#

1clA.ValA = 3;

「こう書けないのか?」の前に「こういう事がしたい」というのがあるはずなので、
それをちゃんと質問に書いていただけると、「ならこういうテクニックがあるよ」と回答しやすいのですが。

投稿2016/11/24 09:41

ishi9

総合スコア1294

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/11/24 09:49

ありがとうございます! やりたいことがあるのですが、その前にそもそも質問の内容みたいなことって普通はやってもいいのかやらないのかの疑問があったのでお聞きしました。 例えばClassBの中にいろんな値をsetするのだけど、そのsetした値の平均値とかをClassAにも格納しておきたいなあと思ったのです。 それだとClassBに平均値のフィールドを作ればって話になりますが、ClassC、ClassDというのもあってClassCに値が入ったら平均値を作り、ClassDにも値が入ったら平均値を作り・・・などちょっと複雑でして、どうしてもClassAに値を保持しておきたかったのです。
ishi9

2016/11/24 15:17

まだちょっと要領を得ない感じですね。 まずはプログラムの構造やら設計の話は置いておいて、 やりたいことを紙に書いて整理するといいかもしれませんね。 設計どうこうの話を軽くいいますと、クラス同士はできるだけ依存関係がないことが理想で クラスA | クラスB 無関係 クラスA → クラスB 一方通行 クラスA ←→ クラスB 互いに依存しあう 設計の内容によりますが、「互いに依存しあう」まで行くと、悪い設計になっている可能性が高いです。できるだけ一方通行の依存性になるよう設計すべきです。 まぁその辺は一旦置いておいてやりたいことを紙に整理するの試してみてください。  
ishi9

2016/11/25 02:05 編集

補足ですが、「依存する」というのがどういう状態かというと (一つの目安ですが)そのクラスを消してコンパイルが通るかどうかです。 例えば一般的な親子関係は子を消してもコンパイルは通りますが、 親を消して子だけ残すとコンパイルは通りません。これが一方通行です。 今のその方向で進むと、恐らくどのクラスを消してもコンパイルが通りませんし、 いざ、いらなくなったので削除しようとしたり一部のものだけ挙動を変えようとするとかなり大変そうです。
退会済みユーザー

退会済みユーザー

2016/11/25 04:57

ありがとうございます! 設計が悪いというのがわかってきました! 具体的に教えてくださって感謝します ちょっと設計を見直そうと思います!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問