アプリ版:「スタンプのみでお礼する」機能のリリースについて

http://www.atmarkit.co.jp/fdotnet/csharp_abc/csh …
上記、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では継承の挙動に違いがあるのでしょうか。

A 回答 (2件)

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

 C#は

public new string getName() { ... }

new の有無で挙動が変わります(変えることができます)。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/06/07 17:04

そのページのコードが示す通り、C# ではメソッドはオーバーライド不可がデフォルトで、オーバーライドするには親クラスで許可を与える必要があります。


一方、Java ではオーバーライド可能で、オーバーライド不可にするには final でそのように制約をかけることになります。

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

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

お礼日時:2014/06/07 17:05

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!