みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C# と Javaの継承の違い

http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_004/csharp_abc02.html
上記、URLの記事にて

Person someone = new Taro();  → TaroはPersonのサブクラス
Console.WriteLine( someone.getName() );
という記述がありgetName()の結果はPersonクラスのgetName()が表示されるとなっていました。

同様のことをJavaにて試してみたところ
Parent pc = new Children(); → ChildrenはParentのサブクラス
pc.getName();

getName()にはChildrenクラスのgetName()が表示されました。
C#とJavaでは継承の挙動に違いがあるのでしょうか。

投稿日時 - 2014-06-07 16:13:09

QNo.8627458

すぐに回答ほしいです

質問者が選んだベストアンサー

ソコの解説をよく読むべし。 C#は

public new string getName() { ... }

new の有無で挙動が変わります(変えることができます)。

投稿日時 - 2014-06-07 16:41:17

お礼

ご回答ありがとうございます。
Javaと同様の動作をさせるためには
親クラスのメソッドにvirtualを付けて継承を許可し、
サブクラスのメソッドにはoverrideすることが必要なの
ですね。

投稿日時 - 2014-06-07 17:04:59

このQ&Aは役に立ちましたか?

7人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

そのページのコードが示す通り、C# ではメソッドはオーバーライド不可がデフォルトで、オーバーライドするには親クラスで許可を与える必要があります。
一方、Java ではオーバーライド可能で、オーバーライド不可にするには final でそのように制約をかけることになります。

これはどちらが優れているかという事ではなくその言語の仕様としてどちらを選んだかにすぎません。
もっとも、Java ではあるメソッドがオーバーライドされているかどうかがわかりづらいため、オーバーライドしたメソッドには @Override アノテーションを付加することが推奨されています(うっかり名前・引数型を間違ってオーバーライドになっていない場合にエラーを出してくれますしね)。

投稿日時 - 2014-06-07 16:47:08

お礼

ご回答ありがとうございます。
Javaと同様の動作をさせるためには
親クラスのメソッドにvirtualを付けて継承を許可し、
サブクラスのメソッドにはoverrideすることが必要なの
ですね。

投稿日時 - 2014-06-07 17:05:16

あなたにオススメの質問