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

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

解決済みの質問

JavaでのポリモーフィズムをC#で表現するには?

最近ふと気になったのですが、以下のJavaのコードと等価なコードは、C#ではどのように書けばよいのでしょうか?

---

public Class1 {
  public void foo() {
    System.out.println("Class1");
  }
}

public Class2 extends Class1 {
  public void foo() {
    System.out.println("Class2");
    super.foo();
  }
}

public Class3 extends Class2 {
  public void foo() {
    System.out.println("Class3");
    super.foo();
  }
}

---

気分的には次のように書きたいところなのですが、このように書くとコンパイルエラーになってしまいます。

---

public class Class1 {
  public virtual void foo() {
    Console.WriteLine("Class1");
  }
}

public class Class2 : Class1 {
  public virtual override void foo() {
    Console.WriteLine("Class2");
    base.foo();
  }
}

public class Class3 : Class2 {
  public override void foo() {
    Console.WriteLine("Class3");
    base.foo();
  }
}

---

調べた限り、ストレートな方法で記述することは不可能だと感じたのですが、やはりそうなのでしょうか?

そうだとしたら、現実にこのように記述する必要が生じた場合には、どのように対処すればよいのでしょうか?

また、C#の言語仕様はなぜこのようになっているのでしょうか?(VMの仕組みも関係あるのでしょうか?)

知っていらっしゃる方がいましたら、教えていただけると助かります。

投稿日時 - 2005-12-25 19:16:31

QNo.1859137

暇なときに回答ください

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

public class Class2 : Class1 {
  public virtual override void foo() {

ではなくて、

public class Class2 : Class1 {
  public override void foo() {

です。
オーバーライドする方 (子クラス側) のメソッドには virtual はつけません。(親クラス側メソッドが virtual だからこそオーバーライドできるわけで、オーバーライドが成立すれば当然子クラス側メソッドも親の virtual 指定を自動的に引き継ぎます。)

投稿日時 - 2005-12-25 20:12:50

お礼

回答どうもありがとうございます。

どうやら、私が相当勘違いしていたようでした(笑

UKYさんがおっしゃるように書くと、
Class3のfoo()を呼び出した場合には、
Class3
Class1
と表示されるものと思いこんでいました。そうではないのですね。

投稿日時 - 2005-12-25 20:47:24

ANo.1

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

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

回答(1)

あなたにオススメの質問