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

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

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

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

3回答

5485閲覧

C# Listを作ったクラスと別のクラスで使用したいです

Daidaya

総合スコア8

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2017/09/02 07:44

編集2017/09/02 10:43

こんにちは。プログラムを書いていて、分からない箇所がでてきたので質問をさせてください。

下にやりたいことをざっと書いたコードを載せてみましたが、
実際には Basyo_data と data_2クラスの間にはいくつかのクラスが入っているため、引数として渡していくのもスマートじゃない気がします。

単純に引数として渡していく以外に良い方法がありましたら教えてください。
そもそもとして、オブジェクト指向の考え方的に間違っている気がしないではないのですが。

何か別の方法があるんじゃないか、という質問になりますので、
リストを作るなら、別のクラス作って云々、というのでも構いません。
いや、引数として渡していけばいいじゃない。というのでも構いません。
こう書くべきでしょ! というのを知りたいのです。

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

(プロパティについてはまだ分からないので触れないでやってください)

C#

1 2//この Carクラスをリストに加えていく。 3class Car 4{ 5 public int XX,XY; 6 public int number; 7} 8 9 10class Basyo_data 11{ 12 public void Basyo() 13 { 14 List<Car> Car_list = new List<Car>(); 15 16 for( int i = 0; i<5 ; i++) 17 { 18 Car car = new Car(); 19 Car_list.Add(car); 20 } 21 22 for( int i = 0; i<5 ; i++) 23 { 24 //ここでCar_listの中身を変更しています。 25 //for文の中でメソッドを呼び出して、返ってきた値を Car_list[i].xx = 26 //などで書き換えています。 27 } 28 29 //ここで別のクラスを呼び出して、次の処理に移る 30 } 31} 32 33class data_2 34{ 35 //このクラスで Basyo_dataで Car_listの中に入れられたインスタンスの中身を取り出したい。 36} 37

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

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

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

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

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

guest

回答3

0

質問以前に class Basyo_data のコードがメチャクチャで議論にならないように思うのですが・・・

Basyo_data はメソッドではなくてクラスですよね?

であれば、

(1) コンストラクタなどで Basyo_data を初期化する際に List<Car> 型のオブジェクトを生成してその参照を Car_list に代入。

(2) Basyo_data クラスには Car_list を取得するためのパブリックプロパティを定義。

(「プロパティについてはまだ分からないので触れないでやってください」なんてのはダメです。そんな超基本的なことを分からないのではこういうところでは質問する資格なしですよ)

(3) class data_2 クラスで Basyo_data クラスを初期化し、上で定義したプロパティを通じて Car_list を取得.

・・・というのが定番のやり方だと思います。

上で言っていることは理解できるでしょうか? 分からなければどこが分からないか聞いてください。

投稿2017/09/02 09:33

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

Daidaya

2017/09/02 10:56 編集

回答ありがとうございます。 長ったらしいプログラムをコピーするのも問題かと、簡単に書いたのですがメソッドを書き忘れたようで申し訳ないです。 プロパティについては、ちょっと今、クラスとリストについて勉強中なので、次辺りにラムダ式と含めて勉強したいと思っています。 ええと、(3)について質問させていただきたいのですが、初期化という言葉からすると Car_listの中身がリセットされてしまうような気がするのですが、そういうわけではないのでしょうか。 それと初期化というのは new で実装するときに {} を使って値を与えることであっていますか? 今それを理解しましたが、現在はlistにまとめてからインスタンスの中の変数を書き換えてしまっています。
Daidaya

2017/09/02 11:10

申し訳ないです。Chironianさんのやり方で納得できてしまった為、あちらをベストアンサーとし締め切らせていただきます。 質問の答えを待つのも何か悪い気がしてしまいますので、大変ありがとうございました。
退会済みユーザー

退会済みユーザー

2017/09/02 11:10

> 長ったらしいプログラムをコピーするのも問題かと、簡単に書いたのですがメソッドを書き忘れたようで申し訳ないです。 「メソッドを書き忘れた」って何を言っているのか分かりません。書き忘れたとかいうレベルではなくて、クラスの書き方として全然ダメなのですが。 ごくごく基本的なことです。そこが分からないと言われると話が通じなくてここのような掲示板での Q&A で解決するのは難しいです。 > プロパティについては、ちょっと今、クラスとリストについて勉強中なので、次辺りにラムダ式と含めて勉強したいと思っています。 プロパティはホントに基本のキです。リストの前に勉強すべきです。ラムダ式なんて十年早いという感じです。 > 初期化という言葉からすると Car_listの中身がリセットされてしまうような気がするのですが リセットではなくて、例えば Basyo_data のコンストラクタで Car_list の中身をセットするコードを書くのです。Basyo_data 初期化する際、コンストラクタを呼べばそこでセットされます。
Daidaya

2017/09/02 11:18

返信ありがとうございます。 プロパティとラムダ式は他の方の書いたコードを読む際に必要になりそうだ。という程度の意識だったので後回しになっていたのです。 手探りでやっていた所、プロパティは必要性をあまり感じなかったのですが、 そこまで言われると先に勉強した方がよさそうですね。 とりあえず、次に進む前に勉強したいと思います。ありがとうございました。
退会済みユーザー

退会済みユーザー

2017/09/02 11:27

本などを読んで、基本的なことを、体系的に、ステップバイステップで勉強することをお勧めします。クラスとリストをまず勉強して、次にプロパティとラムダ式を勉強するというのは、私の個人的な意見を言わせていただければ、間違いです。
退会済みユーザー

退会済みユーザー

2017/09/03 01:42

> 一応、後から見る人がいるかもしれないので訂正しておきます。 最初に書いた質問のコードを直しましたね? そういうことをされると、直す前のコードをベースにしているレスと話が辻褄が合わなくなって「後から見る人」にとって訳が分からなくなるのでやめてください。 直したコードを書きたいのであれば、最初に書いたコードはそのままにして、質問欄の下の方に追記するようにしてください。
Daidaya

2017/09/03 15:33

言われてみればそれはそうですね。ご忠告感謝です。
guest

0

ベストアンサー

こんにちは。

実際には Basyo_data と data_2クラスの間にはいくつかのクラスが入っているため、引数として渡していくのもスマートじゃない気がします。

クラスは、ざっくり言うと変数と関数をセットにしたものです。
Basyo_dataクラスは、Car_list変数を持っています。
恐らくコンストラクタも持っていて、そこでCar_listを初期化したいのだと思いますが、それを記述できていません。まずはそのあたりの基本を学習する必要があると思います。

data_2で、Basyo_dataクラスのCar_list変数をアクセスしたいというご質問と思います。
しかし、Basyo_dataクラスはクラスであってインスタンスではないため、Car_list変数の記憶領域を割り当てられていません。Basyo_dataクラスとはBasyo_dataクラスのインスタンスがCar_list変数を持つという定義でしかなく、実際に領域が確保されるのはnew等でBasyo_dataクラスのインスタンスを生成した時です。
data_2でアクセスしたいCar_list変数の実体(Basyo_dataクラスのインスタンス)がどこにあるのか質問文に記載されていません。そのため、具体的な回答は難しいです。

さて、オブジェクト指向プログラミング言語と言えども、記憶領域(変数)を複数のクラスのメソッドでアクセスしたい場合の選択肢は大してありません。

  1. 当該メソッドに直接引数で渡す
  2. 当該メソッドが属するクラスに渡したい変数への参照メンバ変数を用意し、そのコンストラクタ等で引き渡しておく。
  3. グローバル変数(publicなstatic変数が該当します。)でアクセスできるようにする。

1.を使いたくないケースでは、少数のクラスでのみアクセスする領域は2.で、ほとんど全てのクラスでアクセスしたい場合は3.で渡すとプログラムの見通しが良くなる場合が多いです。

投稿2017/09/02 09:37

Chironian

総合スコア23272

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

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

Daidaya

2017/09/02 11:05 編集

回答ありがとうございます。 とりあえずは3のやり方でやってみました。そうか、リストって変数に代入してたんだな。と目から鱗状態です。加えて public classという概念が頭から抜け落ちていたようで、あっさりと解決しました。 ですが、少数のクラスでのみアクセスできれば良いので2のやり方についても勉強してみたいと思います。 ありがとうございました。
Daidaya

2017/09/02 12:59

修正前なら3で出来たと思いますが、修正後だと3では不可能でした。 (staticなら値が保持されるかと思ったのですが、リセットされてしまっていた) ので、1の引数で渡していく形での実装になりました。 一応、後から見る人がいるかもしれないので訂正しておきます。
Chironian

2017/09/02 13:31

お疲れ様です。3はちょっと難しいことと、グローバル変数はなるべく使わない方が好ましい(安易に使えることもあり、大きなプログラムでバグの原因になりやすい)ので、変な癖を付けないためには1か2の方が好ましいと思います。 頑張ってください。
Daidaya

2017/09/03 15:32

ありがとうございます。がんばります!
guest

0

まだ、C#を使えていない感じなので、レベル的に無理そうだけど、
こういう問題は、Inversion of Control(通称IoC) や Dependency Injection (通称DI)を使う。説明は面倒なのでググってくれ。

ただ、当面は、オブジェクトの参照を突っ込む、密結合になるやり方でいいじゃないかな。

投稿2017/09/02 08:12

編集2017/09/02 08:16
kiichi54321

総合スコア1984

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

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

Daidaya

2017/09/02 09:57

DIについて少し調べてみたのですが、大変便利そうなのでなんとか今作っているプログラムを完成させる前には実装してみたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問