万年素人からHackerへの道

万年素人がHackerになれるまで殴り書きするぜ。

  • ・資産運用おすすめ
    10万円は1000円くらい利益
    資産運用ブログ アセマネ
    • ・寄付お願いします
      YENTEN:YYzNPzdsZWqr5THWAdMrKDj7GT8ietDc2W
      BitZenny:ZfpUbVya8MWQkjjGJMjA7P9pPkqaLnwPWH
      c0ban:8KG95GXdEquNpPW8xJAJf7nn5kbimQ5wj1
      Skycoin:KMqcn7x8REwwzMHPi9fV9fbNwdofYAWKRo

    C#のnewとoverride

    Override キーワードと New キーワードによるバージョン管理 (C# プログラミング ガイド)

    の日本語がわかりにくい。

    new

    派生クラスのメソッドの前に new キーワードが記述されている場合、 そのメソッドは、基本クラスのメソッドから独立したものとして定義されます。

    「基本クラスのメソッドから独立したもの」??なにそれ?

    override

    派生クラスのメソッドの前に override キーワードが記述されている場合、 派生クラスのオブジェクトは、基本クラスのメソッドではなく、派生クラスのメソッドを呼び出します。

    「派生クラスのメソッドを呼び出します」??つまり?

    10日でおぼえるC#入門教室 - arton - Google ブックス を見て、

    違いがわからないので自分なりにまとめた。 「as SuperClass」でキャストした時の振る舞いが違うようだ。

    まずはoverride

    class SuperClass
    {
        internal int Foo ()
        {
            // do something
        }
    }

    のような場合

    class SubClass : SuperClass
    {
        internal new int Foo ()
        {
            // do something
        }
    }
    var spr = new SubClass () as SuperClass;
    var sub = new SubClass (); // SuperClassで意義したFooメソッドが呼ばれる
    spr.Foo ();
    sub.Foo ();

    この結果、SuperClassで定義したものが呼ばれている。

    class SuperClass
    {
        internal virtual int Foo()
        {
            // do something
        }
    }
    class SubClass : SuperClass
    {
        internal override int Foo ()
        {
            // do something
        }
    }
    var spr = new SubClass () as SuperClass;
    var sub = new SubClass ();
    spr.Foo (); // SubClassで意義したFooメソッドが呼ばれる
    sub.Foo ();

    この結果、SubClassで意義したFooメソッドが呼ばれる

    独習C# 第3版

    独習C# 第3版