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に慣れきっている身にはちょっと辛い。