この章のテーマ §
型の継承とsealedキーワードについて学びます。継承で型に機能を追加できますが、sealedキーワードで継承を禁止することもできます。
前提知識 §
Console.WriteLineメソッド, 文字列の基礎, 変数の基礎, classの基礎, 型変換の基礎, string型
解説 §
C#の型は多くの場合継承できます。継承とは、型にメンバーを追加した新しい型を創り出す行為です。継承を行うのは簡単で、public class Student: Personのように、クラスを宣言する場合なら新しいクラス名のあとにコロン記号を置いて、その後に継承元のクラス名を書くだけです。
継承を行った型は、元の型として扱える機能も持っているので、public class Student: Personとして宣言したインスタンスは、Student型の変数にもPerson型の変数にも代入可能です。ただし、Person型として扱うとStudent型で追加された機能は扱えません。(扱うためにはキャストなどで型を変換する必要があります)
継承は便利な機能ですが、希に継承されると困る状況が発生します。そういうときは、sealedキーワードを宣言に付けておくと、その型からの継承はできません。
罠の数々 §
- よく使う型で言うと、たとえばstring型はsealedキーワードが付いているので継承できない
- ソースコードが提供されない型であっても、継承の機能を使うと、あとからメンバーを追加できる場合がある。便利である
- 継承の使い過ぎは禁物である。「あれ、このメンバー、どのクラスで定義したんだっけ」となりがちである
参考リンク §
継承 - 型を派生させて特殊な動作を作成する
sealed (C# リファレンス)
サンプルソース: Inheritance §
var papa = new Person();
papa.Name = "ウルトラの父";
var boku = new Student();
boku.Name = "ウルトラのタロウ";
boku.SchoolName = "ウルトラ小学校";
var man = new SuperMan();
man.Name = "スーパー紅茶マン";
man.CameFrom = "リプトン星";
outputCommon(papa);
outputCommon(boku);
outputCommon(man);
void outputCommon(Person p)
{
Console.WriteLine($"あいつの名前は{p.Name}");
}
public class Person
{
public string? Name { get; set; }
}
// まだまだここから継承できる
public class Student: Person
{
public string? SchoolName;
}
// もうここから継承できない
public sealed class SuperMan : Person
{
public string? CameFrom;
}
実行結果 §
あいつの名前はウルトラの父
あいつの名前はウルトラのタロウ
あいつの名前はスーパー紅茶マン
リポジトリ §
https://github.com/autumn009/CSharpPrimer2
練習問題 §
全ての型はobject型を継承していると言われるが、僕の作ったbokuクラスは何も継承していない。
この考えは正しいだろうか?
- 正しい。class boku {……}にはどこにも継承元クラスが書かれていない
- 正しくない。全ての型は親か祖先がobject型であると決まっている。何も指定していないと暗黙的にobject型を継承していると見なされる
[[解答]]