前回の続き。11章、継承
継承
何かのクラスをもとに似たようなクラスを作るとき、コピペでクラスを作ったら、元のクラスに変更があったときに、どちらも変更しないといけない。
また同じようなコードばかりだと見通しが悪い。
メンテナンスしにくい
そこで元のクラスを継承したクラスを書く
書き方
public class クラス名 extends 元となるクラス{
追加するフィールド
追加するメソッド
}
HeroクラスをもとにSuperHeroクラスだけに追加するものを書けばいい
子クラスに書いてなくて親クラスに書いてあるメソッドも、子クラスのインスタンスで呼び出すことができる。
呼び方
元となるクラスを親クラス、スーパークラス、基底クラス
新しいクラスを 子クラス、サブクラス、派生クラス
などと呼ぶ
オーバーライド
親クラスで定義してあるが、特定の子クラスでちょっと変えたいものは、同じ名前でメソッドを定義して上書きができる。
これをオーバーライドという
継承禁止
継承してほしくないクラスにはfinalを付ける。
public final class Main{}
stringクラスはAPIで継承禁止と指定されている
c#だとfinalじゃなくてsealed class クラス名 だって
super
親インスタンスのメソッドやフィールドにアクセスするには
super.メソッド名
のようにsuperを付ける
自分のインスタンスへはthis.
祖父母インスタンスにはアクセスできない
親のコンストラクタ
自動で親のコンストラクタがよばれ、そのあと子のコンストラクタが呼ばれる。
親コンストラクタの呼び出しは
super();
書かなくても勝手に呼ばれる。
親クラスのコンストラクタに引数の指定があるときは
super("名無しの剣",300);
正しい継承
子クラスは親クラスの一種である。
・薬草はアイテムの一種である。
・村人はキャラクタの一種である。
親クラスほどあいまい(汎化)
子クラスほど具体的(特化)
最後に
C#だと
public class NewBehaviourScript : MonoBehaviour {
extendsが「:」になってる?