###前提・実現したいこと
お世話になります。
現在、C#を勉強し始めたところ、コンパイラの動作と参考にしている教科書で食い違いがあった為、質問させていただきます。
【前提】C#における継承の学習中
教科書:
スーパークラスのオーバーライド元となるメソッドに「virtual」、
サブクラスのオーバーライド先となるメソッドに「override」を記述しなくとも、
コンパイル時にエラーが出るが、コンパイルはでき、実行もできる。
コンパイル時:
実際の警告文は下記参照願います。
警告文が発生し、EXEファイルが生成されない。
【実現したいこと】
以下のことを知りたいです。
初歩的なことで申し訳ありませんが、ご教授願います。
1.教科書の「警告は出るが、コンパイルできる」は正しいのか。
2.(1が正しいとして)どのようにすれば、コンパイルは通るのか。
###発生している問題・エラーメッセージ
inheritance.cs(53,35): warning CS0108: 'EnchancedMyObject.PrintData()' hides inherited member 'MyObject.PrintData()'. Use the new keyword if hiding was intended.
###該当のソースコード
C#
1 using System; 2 3 namespace foo 4 { 5 class Program 6 { 7 public static void Main(string[] args) 8 { 9 EnchancedMyObject obj = new EnchancedMyObject(); 10 obj.name = "テスト"; 11 obj.age = 20; 12 obj.mail = "sample@sample.com"; 13 obj.PrintData(); 14 obj.PrintDataEnchanced(); 15 Console.ReadKey(); 16 } 17 } 18 19 class MyObject 20 { 21 public string name = "(noname)"; 22 public int age = 0; 23 24 // オーバーライド元 25 public void PrintData() 26 { 27 Console.WriteLine("名前:{0}, 年齢:{1}歳", name, age); 28 } 29 } 30 31 class EnchancedMyObject : MyObject 32 { 33 public string mail = "(no mail)"; 34 35 // オーバーライド先 36 public void PrintData() 37 { 38 Console.WriteLine("Method\"PrintData\" was overrided."); 39 } 40 41 public void PrintDataEnchanced() 42 { 43 Console.WriteLine("名前:{0}" + Environment.NewLine + "年齢:{1}" + Environment.NewLine + "メール:{2}.", name, age, mail); 44 } 45 } 46 }
###試したこと
オーバーライドするメソッドにvirtual, overrideを記述している場合は問題なくコンパイルでき、実行してオーバーライドされていることを確認しています。
###補足情報(言語/FW/ツール等のバージョンなど)
現在、新しいものを試す意味も含め、OSXにVisual Studioをインストールし、
Visual Studio Codeにて、CSCを使用してコンパイルしています。
(実行時はMonoを使用)
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/05/22 13:36