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

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

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

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

Q&A

解決済

3回答

3106閲覧

処理の流れ

Saya_A

総合スコア76

C#

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

0グッド

0クリップ

投稿2016/12/21 20:56

プログラミングの基礎を勉強中で、メソッド、クラスなどのあたりで躓いています。

C#

1class Girl 2{ 3 public string name; 4} 5class Incubator 6{ 7 public string name; 8 public MagicalGirl ContractWith(Girl girl) 9 { 10 MagicalGirl r = new MagicalGirl(); 11 r.girl = girl; 12 r.gift = "レイジングハート"; 13 14 System.Console.WriteLine(girl.name + "が" + name + "と契約しました"); 15 return r; 16 } 17} 18class MagicalGirl 19{ 20 public Girl girl; 21 public string gift; 22 23} 24 25class Test 26{ 27 public static void Main(string[] args) 28 { 29 Girl nanoha = new Girl(); 30 nanoha.name = "高町なのは"; 31 32 Incubator yuno = new Incubator(); 33 yuno.name = "ユーノ・スクライア"; 34 35** MagicalGirl lyricalNanoha = yuno.ContractWith(nanoha); 36 System.Console.WriteLine("魔法少女: " + lyricalNanoha.girl.name); 37 System.Console.WriteLine("ギフト: " + lyricalNanoha.gift);** 38 } 39}

イメージ説明

勉強中のサイトの練習用コードなのですが、特にボールドテキストで囲んだあたりの処理の流れが理解できません。
iyricalNanoha.girl.nameがなぜ高町なのはになるのかなるのかなどそのあたりが分かりません。m(__)m

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

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

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

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

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

guest

回答3

0

こんにちは。

まず、前準備として、

  1. nanohaはクラスGirlのインスタンスで、メンバ変数nameに "高町なのは"を設定しています。
  2. yunoはクラスIncubatorのインスタンスで、メンバ変数nameに "ユーノ・スクライア"を設定しています。

この状態で、yuno(Incubatorクラス)のContractWith()メソッドを呼び出しています。
実パラメータとしてnanohaを渡してますので、ContractWith()メソッドの仮パラメータgirlにはnanohaが設定されます。両者とも同じGirlクラスなので適切に渡せます。

----- ここからContractWith()メソッド
そして、ContractWith()の中でMagicalGirlクラスのインタンスrを生成してます。
そのメンバ変数girlに仮パラメータgirl(これにはnanohaが入ってます)を設定し、メンバ変数giftには"レイジングハート"を渡してます。

ここで、「仮パラメータgirlのnameメンバ変数(girlはnanohaなのでnameには"高町なのは"が設定されてます) + "が" + 自身のname(自身はyunoなのでnameには"ユーノ・スクライア"が設定されてます) + "と契約しました"」を表示しています。

そして、上記で設定した r を戻り値として返却してます。
----- ContractWith()メソッドはここまで

Mainに戻って、ContractWith()メソッドの戻り値をlyricalNanohaへ設定してます。
そのメンバ変数girlのname(girlはnanohaが設定されてますので、nameには"高町なのは"が入ってます)とメンバ変数gift(ContractWith()で"レイジングハート"が設定されてます)が表示されます。

投稿2016/12/22 02:02

Chironian

総合スコア23272

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

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

Chironian

2016/12/22 02:04

うはっ。質問から5時間経過しているのでゆっくり回答しても大丈夫かなと思ったら、3つもかぶるとは、びっくり。
guest

0

ベストアンサー

クラス、インスタンス、オブジェクトについての勉強になると思います。

変数や配列、ハッシュテーブルが理解できているのであれば、考え方は似ていると思います。

Girlというクラスは、nameというメンバをもっており、
このクラスをnewすることによってインスタンスを生成します。

例えば

C#

1Girl nanoha = new Girl(); 2nanoha.name = "高町なのは";

で「高町なのは」というnameをもつGirlクラスのインスタンスが作られました。
他にインスタンスを生成するときはGirlクラスをnewするときに別の変数にいれてあげれば、
他の名前でインスタンスを作ることができます。

C#

1Girl fate = new Girl(); 2fate.name = "フェイト・テスタロッサ";

nanohaとnameやfateとnameの間にある「.」ドットは、強引に日本語で読むと「の」になります。
Girlクラスのオブジェクトnanoha「の」nameという感じです。
そこに「高町なのは」というstringを入れているのです。
逆に、nanohaのnameは何かを確認したい場合は、

C#

1System.Console.WriteLine(nanoha.name);

で「高町なのは」が出力されます。

Incubatorクラスについてはメンバーメソッドが出てきています。
メンバー変数についてはGirlクラスと同じなので特に問題はないと思います。
IncubatorクラスのメンバメソッドであるContractWithメソッドは、
戻り値の型も引数の型も他クラスのオブジェクトになっています。
Girlクラスのオブジェクト(先ほどでいうnanoha)を受け取って内部の処理を行い、
MagicalGirlクラスのオブジェクトで返してあげなければいけません。

さて、

C#

1MagicalGirl lyricalNanoha = yuno.ContractWith(nanoha);

の部分ですが、
このメソッドの名前からも想像できるように、何か契約しているのではないかという予想ができます。
このメソッドの中で、MagicalGirlクラスをnewしてインスタンスを生成しているのがわかります。
MagicalGirlクラスはGirlクラス型のメンバ変数とstring型のメンバ変数を持っています。
MagicalGirlクラスのオブジェクト「r」のgirlとgiftをそれぞれ与えています。
MagicalGirlクラスのgirlの型と引数の型は同じなので代入できますね。
そしてこのメソッドはそれぞれのメンバ変数を埋めたMagicalGirlクラスのオブジェクト「r」を返します。

ということは、lyricalNanohaの中には先ほどのメソッドの中で作られたMagicalGirlクラスのオブジェクトが代入されます。
あとは先ほどの強引な日本語で読むを使ってみればよいと思います。

lyricalNanoha.girl.name
lyricalNanohaのgirlのnameなので、最初にnewされたGirlクラスのインスタンスが代入されています。

長文失礼しました。
案外自分もよくわかってないのかも・・・。

投稿2016/12/22 01:48

s.t.

総合スコア2021

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

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

Saya_A

2016/12/22 05:35

大変ありがとうございました。 初歩的なことで解答こないかとあきらめかけていたのでアンサー、大変助かりました。(*- -)(*_ _)ペコリ
guest

0

lyricalNanoha.girl.nameが「高町なのは」なのはContractWithメソッド内で新しく作ったMagicalGirlのインスタンスのGirlフィールドにnanohaを設定しているからです。

MagicalGirl lyricalNanoha = yuno.ContractWith(nanoha);

ContractWithを展開し、いらない文言を全部取り除くとこうなってるだけです。

Girl nanoha = new Girl(); nanoha.name = "高町なのは"; MagicalGirl lyricalNanoha = new MagicalGirl(); lyricalNanoha.girl = nanoha; System.Console.WriteLine("魔法少女: " + lyricalNanoha.girl.name);

正直プログラム的に趣旨の無いサンプルで分かりづらいです。Factoryパターンのサンプルなのかなとは思いますが、あまりにも…って感じです。

投稿2016/12/22 02:02

haru666

総合スコア1591

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問