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

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

ただいまの
回答率

87.78%

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

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 11K+

score 8

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

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

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

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

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

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

//この Carクラスをリストに加えていく。
class Car
{
     public int XX,XY;
     public int number;
}


class Basyo_data
{
     public void Basyo()
     {
          List<Car> Car_list = new List<Car>();          

          for( int i = 0; i<5 ; i++)
          {
               Car car = new Car(); 
               Car_list.Add(car);
          }

          for( int i = 0; i<5 ; i++)
          {
          //ここでCar_listの中身を変更しています。
          //for文の中でメソッドを呼び出して、返ってきた値を Car_list[i].xx = 
          //などで書き換えています。
          }

     //ここで別のクラスを呼び出して、次の処理に移る
     }
}

class data_2
{
     //このクラスで Basyo_dataで Car_listの中に入れられたインスタンスの中身を取り出したい。
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+2

質問以前に 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 20:27

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

    キャンセル

  • 2017/09/03 10:42

    > 一応、後から見る人がいるかもしれないので訂正しておきます。

    最初に書いた質問のコードを直しましたね?

    そういうことをされると、直す前のコードをベースにしているレスと話が辻褄が合わなくなって「後から見る人」にとって訳が分からなくなるのでやめてください。

    直したコードを書きたいのであれば、最初に書いたコードはそのままにして、質問欄の下の方に追記するようにしてください。

    キャンセル

  • 2017/09/04 00:33

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

    キャンセル

checkベストアンサー

+1

こんにちは。

実際には 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 20:02 編集

    回答ありがとうございます。

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

    キャンセル

  • 2017/09/02 21:59

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

    一応、後から見る人がいるかもしれないので訂正しておきます。

    キャンセル

  • 2017/09/02 22:31

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

    キャンセル

  • 2017/09/04 00:32

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

    キャンセル

0

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/02 18:57

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

    ありがとうございました。

    キャンセル

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

  • ただいまの回答率 87.78%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る