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

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

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

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

Q&A

解決済

3回答

1708閲覧

C# クラスの継承について

niconicodryyy

総合スコア36

C#

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

0グッド

0クリップ

投稿2019/05/09 07:41

C#

1 2using System; 3 4class Book 5{ 6 public string title; 7 public string genre; 8 9 public void printBook() 10 { 11 Console.WriteLine("タイトル:" + title); 12 Console.WriteLine("ジャンル:" + genre); 13 } 14} 15 16class Novel : Book 17{ 18 public string writer; 19 public void printNov() 20 { 21 printBook(); 22 Console.WriteLine("著者:" + writer); 23 } 24} 25 26class Magazine : Book 27{ 28 public int day; 29 public void printMag() 30 { 31 printBook(); 32 Console.WriteLine("発売日 :" + day + "日"); 33 } 34} 35 36class Bookshelf 37{ 38 public static void Main() 39 { 40 Novel nov = new Novel(); 41 nov.title = "しおりの秘境発見"; 42 nov.genre = "ファンタジー"; 43 nov.writer = "アンク"; 44 45 Magazine mag = new Magazine(); 46 mag.title = "月間C#no絵本"; 47 mag.day = 20; 48 49 nov.printNov(); 50 Console.WriteLine(); 51 mag.printMag(); 52 } 53}

上記のコードはテキストC#の絵本より抜粋しております。
独学で勉強していますが、クラスで行き詰まっていますのでお力をお借りしたいです。

下から }を抜いた3行

C#

1    nov.printNov();...1 2 Console.WriteLine();...2 3 mag.printMag();...3

は何の為にあるのでしょうか?

それぞれのクラスに Console.WriteLineとあるので無くても表示されると思いましたが
この1と3が無いと表示されません。
また2はあってもなくても表示されますが、わかりやすくする為に書いてるもので本来はいらないものなのでしょうか?

ご教授お願い致します。

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

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

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

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

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

Zuishin

2019/05/09 07:44

そのあたりを解説してないような絵本をやめてちゃんとした本を読んだ方がいいと思います。
niconicodryyy

2019/05/10 00:05

ご丁寧にありがとうございます。 知識が0から始めたいと思い購入しましたが、確かに知識としてではなくイメージとしての本ってコメントがしっくり来ました。 何か自分に合ういい書籍を探してみます。
Zuishin

2019/05/10 01:25

イメージにしてもコードがへたくそすぎます。 初心者向けの本ではなく初心者が書いた本です。 著者名も法人ですし、その辺からバイトでも雇って安く書かせたんでしょう。
guest

回答3

0

ベストアンサー

回答にするか迷いましたが、書きます。

継承の前に、

  • オブジェクト指向
  • クラスとインスタンス
  • メンバー(フィールド、プロパティ、メソッドなど)

辺りの勉強が先だと思います。
この辺りの理解が曖昧だと今回のような質問が出来上がります。

このコード以前に理解できていない部分が他にもあるのではありませんか?

C#

1 nov.printNov(); 2 Console.WriteLine(); 3 mag.printMag();

例えば、以下2つのコードについて(実際に返信はされなくても構いませんが)説明をしてみてください。

C#

1class Bookshelf 2{ 3 public static void Main() 4 { 5 Novel nov = new Novel(); 6 nov.title = "しおりの秘境発見"; 7 nov.genre = "ファンタジー"; 8 nov.writer = "アンク"; 9 10 Magazine mag = new Magazine(); 11 mag.title = "月間C#no絵本"; 12 mag.day = 20; 13 14 nov.printNov(); 15 Console.WriteLine(); 16 mag.printMag(); 17 } 18}

C#

1class Book 2{ 3 public string title; 4 public string genre; 5 6 public void printBook() 7 { 8 Console.WriteLine("タイトル:" + title); 9 Console.WriteLine("ジャンル:" + genre); 10 } 11}

どうでしょう、説明できましたか?

説明できなかった場合

まずは説明が出来るレベルまで、公式ドキュメントや解説サイト、参考書を見て学びましょう。
でなければ理解は深められません。

説明できるようになってきたらこのまま下の文章を読んでください。

説明できた場合

質問です。
以下のコードについて、きちんと説明はできましたか。

  • class Bookshelf{~}
  • nov.title = "しおりの秘境発見";
  • public static void Main(){~}
  • Novel nov = new Novel();
  • Console.WriteLine();
  • public string title;
  • public void printBook(){~}

次に、その説明が正しいとされる根拠・出典を示してみましょう。
可能なら公式ドキュメントから抜粋できれば良いですが、サイトや教材でもひとまずは構いません。
示せましたか。

ここまでの工程が理解しているか否かの最低ラインだと私は思っています。

結論

話を戻しますが、前提の理解が足りていれば今回の質問は恐らく出てこないはずです。
今まで内容をまとめると次の2点になります。

  • 新しいことを学ぶ前に前提の理解が深められているか確認をする
  • その方法の一つは「正しい根拠を持った説明を誰かにすること」

適切に理解を深めるヒントになるはずなので、上記2点を是非心掛けてください。

投稿2019/05/10 02:57

編集2019/05/10 03:19
BluOxy

総合スコア2663

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

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

0

それぞれのクラスに Console.WriteLineとあるので無くても表示されると思いましたが
この1と3が無いと表示されません。

メソッド」の機能は理解されていますでしょうか?
たしかにそれぞれのクラスに Console.WriteLine と記述されていますが、メソッドを呼び出さなければ実行されません。

また2はあってもなくても表示されますが、わかりやすくする為に書いてるもので本来はいらないものなのでしょうか?

これは改行を入れて見やすくしているだけですね。
この行だけコメントアウトして実行結果を見比べてみると分かると思います。

投稿2019/05/09 07:58

nskydiving

総合スコア6500

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

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

niconicodryyy

2019/05/10 00:12

2の使い方はわかりましたが、おっしゃられる通りメソッドについての知識が曖昧ですしまた、引数についても理解が追いついていませんのでもう少し深く学習したいと思います。ありがとうございます。
k.matsuda

2019/05/10 00:54 編集

よく、classは設計図だといわれます。 あくまで設計図なので、 それを元に実体を作成して、   Novel nov = new Novel(); パラメーターを設定し、   nov.title = "しおりの秘境発見"; スイッチを押して、処理を実行する   nov.printNov(); 厳密には違うかもしれませんし、もっと複雑でしょうけど・・・。
guest

0

それぞれのクラスに Console.WriteLineとあるので無くても表示されると思いましたが

この1と3が無いと表示されません。

引数についても理解が追いついていません

と発言されていたので、そもそも関数というものをあまり理解していないと感じました。
ここを参考にして理解を深めておいて下さい。

あと、magのgenreはしっかりと初期化しましょう。C#なら大丈夫ですが他の言語ではだめという場合もありますよ。
プログラムの基本は初期化解放更新描画です。

投稿2019/05/10 01:03

編集2019/05/10 04:50
stdio

総合スコア3307

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

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

Zuishin

2019/05/10 01:36

なんで C 言語の関数とか関数型プログラミングとかリンクしてるんでしょうか? 低評価しました。 違う言語です。
stdio

2019/05/10 02:16 編集

Zuishinさん 関数や引数や戻り値の説明に言語なんて関係ないですよ。 継承以前にプログラムの基本を知らないように感じましたのでそうさせて頂きました。 それかガチのC#のサイトを出せば満足するのかしらね【#・∀・】ムカムカ http://midorinobike.in.coocan.jp/CS/index.html
Zuishin

2019/05/10 02:21

関係あります。 C と C# は Java と JavaScript くらい違います。もっと言えばメロンとメロンパンくらい違います。 メロンパンの基本を教えるのにメロンの基本を教えるのは不適切です。 この質問で問われているのは関数ではなくメソッドであり、C# の関数はもっと広い概念です。それが基本です。そこを押さえなければ間違うでしょう。 関数型に至ってはまるで関係ありません。
Zuishin

2019/05/10 02:34

それを読んだからどうなんですか? メソッドは「メンバー関数」と書かれています。メロンとメロンパンくらい違います。 引数がわからないなら C# の引数を教えるべきです。 printf のような C# で動かない関数が入っているコードなど初心者には何の役にも立ちません。
Zuishin

2019/05/10 02:35

それと、C# が影響を受けたのは C だけではありません。C にはない概念が多く存在します。日本語が中国語の影響を受けているから日本人はまず中国語を基本として学ぶべきだと主張するくらいの暴論です。
stdio

2019/05/10 02:44

> 日本語が中国語の影響を受けているから日本人はまず中国語を基本として学ぶべきだ その名残本来なくてもいいはずの漢字という文字が日本には存在しているのですが... そもそも関数が理解出来ていないなら話が進まない。関数の歴史を学べとは言ってませんが基本はしっかりと押さえましょうと言いたいのですが...
Zuishin

2019/05/10 02:47

違う言語の基本は基本ではないということです。 似ているだけです。 たとえばインスタンスメソッドには暗黙の引数がありますが、C の関数にはありません。
stdio

2019/05/10 02:54

似ているなら初心者相手にはいいだろうと思っています、理解の速度が早くなるから。 教えるのに貴方は全く同じでないといけないと言い張るつもりですか? そんなルール聞いたことないですね。
Zuishin

2019/05/10 02:57

あなたが聞いたことあろうがなかろうが関係ありません。 C# を学ぶのに C から学ぶ必要はない、それだけです。 C から学ぶことで理解の速度は速くなりません。 不要なものを学び、また C# を学びなおすことで遅くなります。 違う言語なので、これを同じものだと思っていたら大きく間違います。
Zuishin

2019/05/10 02:58

あなたがまず間違っているのは「C 言語は C# の基本である」「中国語は日本語の基本である」ということです。 基本ではありません。 違うものです。
Zuishin

2019/05/10 03:03

C# のコードで教えるなら、それを実際に打ち込み、コンパイルして走らせて結果を確かめることができます。しかし、C のコードではそうはいきません。まず C コンパイラをインストールし、printf とは何か、%d とは何かということから学び、コンパイルして実行し、それを C# に適用しようとして C と C# の違いを学ばなければなりません。 まったく早くありません。
YAmaGNZ

2019/05/10 03:03

文法に近い部分があやふやな初心者には現在習得中の言語と同じ言語の資料を提示したほうがよろしいかと思います。 この方はどちらかというと関数というよりクラス・インスタンスの考え方のほうの理解が足りていないような印象は受けますけどね。
Zuishin

2019/05/10 03:05

そうですね。インスタンスの作成とメソッドの実行を混同しています。これを C 言語で教えるのは不可能です。
stdio

2019/05/10 03:18

Zuishinさん、性格の違いが露見してますね。 C#のコードを教えるならC#のコードでなければならないと申しましたが、それは黒板に書かれた文字をノートに写すのと同じ事。その時は出来ても後で思い出せるかと言えば違うと思います。 私は相手に思考を働かせる教え方しかしません、だからあえて別の言語をページをリンクに貼りました。 貴方は答えを教えて「こうだ!!」と相手に押し付けているだけの日本の教育方針と変わりありません。
BluOxy

2019/05/10 03:25 編集

関数とメソッドは構文こそ少し似れど、全然違います。手続き型とオブジェクト指向の機能をごっちゃにしたら色々誤解が生じそうです。 もし馬鹿正直にクラスの外にメソッドを定義してしまったらstdioさんの責任になってしまいますよ。 普通にC#のメソッドについて解説をすれば良いと思います。
k.matsuda

2019/05/10 03:31 編集

横から失礼します。 見ること、考えること、体験すること すべてが勉強だと思いますので、体験できるC#での解説が望ましいのではないかと考えます。 追記 私もC#の学習の前提としてC言語の講座を受けましたが、結局C#を最初から学習してます。
YAmaGNZ

2019/05/10 03:28

別に「答え」を教えろとは言ってないわけで C#がおぼつかない人にCの資料を出したら混乱させる可能低があるから、出すならC#の資料って言ってるだけでしょ。 それは思考を働かせないような教え方ではないでしょ
stdio

2019/05/10 03:40

> もし馬鹿正直にクラスの外にメソッドを定義してしまったらstdioさんの責任になってしまいますよ。 その時はその時です。エラー出るだけですよ。そして修正作業になるだけです。 結果的に私は恨まれるかも知れませんが、責任にはなりません。 > C#がおぼつかない人にCの資料を出したら混乱させる可能低があるから、出すならC#の資料を出す。 確かにその考え方は大事です。しかし、Cのprintfや%dの意味は何かを探すのは現代では非常に簡単なことです。その時に理解し覚えればいい話です。
BluOxy

2019/05/10 03:54

>結果的に私は恨まれるかも知れませんが、責任にはなりません。 それは無責任です。 回答者が直接責任を負うことはありませんが、一技術者として回答内容には責任を持ってください。
stdio

2019/05/10 04:50 編集

> 回答者が直接責任を負うことはありませんが、一技術者として回答内容には責任を持ってください。 確かにその意見はもっともですね。一つ目のリンクはまだいいとしても、二つ目のリンクは消しておきましょう。話をややこしただけでした。
Zuishin

2019/05/10 07:07

いや一つ目も二つ目もどっちも論外です。 プログラミングの基本が「初期化、解放、更新、描画」というのも「なんだその珍説?」ですし、初期化がすでに済んでいるものを「しっかり初期化しましょう」というのも「別にしてもいいけどそれ二度手間」としか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問