コンピュータクワガタ

かっぱのかっぱによるコンピュータ関連のサイトです

C#の学習 No. 2 継承関連

継承もJavaと少し異なっている。

override

overrideする場合には、スーパークラスでvirtual宣言が必要な部分が違う。
継承できるメソッドは事前に決めて置く必要があるということ。意味はないけど以下サンプル。

namespace Sample
{
    class Test
    {

        static void Main(string[] args)
        {
            TestClass t = new TestClass();
            t.Hoge = 4;
            System.Console.WriteLine(t.Calculate());

            TestClass2 t2 = new TestClass2();
            t2.Hoge = 4;
            System.Console.WriteLine(t2.Calculate());
        }
    }
    class TestClass
    {
        public int Hoge { get; set; }

        public virtual int Calculate()
        {
            if (Hoge == 0)
            {
                return 99;
            }
            return Hoge * Hoge;
        }
    }

    class TestClass2 : TestClass {
        public override int Calculate()
        {
            return Hoge * 100 + 1;
        }
    }
}

TestClass#Calculateにvirtualがなくても怒られるし、TestClass2#Calculateにoverrideがなくても怒られる。

ここで、TestClassを継承したTestClass3を継承し継承可能な(virtual)なCalculateを作成する場合new virtualとしないとだめ(警告)。

class TestClass3 : TestClass
{
    public new virtual int Calculate()
    {
        return Hoge * 100 + 1;
    }
}

abstractはJavaと似ている。また、sealedクラスはJavaのfinalクラスと同様に継承を許さない。
この辺は少しなれないと戸惑いそうな感じ。Javaに慣れきっている身にはちょっと辛い。

スーパークラスコンストラクタ呼び出し

スーパークラスコンストラクタを呼ぶ場合、Javaのようにthis()ではなく、baseを使用する。

namespace Sample
{
    class Foo
    {
        private int number;
        public Foo(int number)
        {
            this.number = number;
        }
    }

    class Foo2 : Foo
    {
        public Foo2(int number) : base(number)
        {
        }
    }
}