ITコンサルの日常

ITコンサル会社に勤務する普通のITエンジニアの日常です。

継承できないシールクラス

プログラミングC# p117

またも新しいキーワード「sealed」
これをクラスに指定すると、そのクラスからは継承できなくなる。

sealed class Sealed
{
}

class Derived : Sealed
{
}

コンパイルするとこうなる。

Sealed.cs(5,7): error CS0509: 'Derived': シール型 'Sealed'
        から派生することはできません。

ちなみにJavaの場合は、finalを付ける。

public final class Sealed
{
}

class Derived extends Sealed
{
}

コンパイルするとこうなる。

Sealed.java:5: final Sealed からは継承できません。
class Derived extends Sealed

C#は「派生することはできません。」で、Javaは「継承できません。」か。
なんか微妙に言い回しが違うのは、お互い意識しているから?なんて考えすぎか。。

Javaのfinalキーワードは、昨日書いた一度しか初期化できない変数(定数)にも用いられるため、二重の意味を持っています。同じキーワードでも使うコンテキストによって意味が異なります。
一方のC#は、それぞれreadonlyキーワード、および、sealedキーワード(おまけにconstキーワードもある)に明確に分けていますね。
どっちが良いとか悪いとか人それぞれだと思うのですが、個人的には、あれこれキーワードが出てきても覚えるのが大変だし、Javaみたいにキーワードを少なくする方向の方がいいかなと思います。