前回は継承について学んだ。今回は高度な継承
高度な継承
継承の元となる親クラスは抽象的。
あらかじめ未来で使うだろうと用意しておいたもの。
このクラスを作るというのは、立場や考え方が違う
問題点
高度な継承を作る際の問題点
必要なメソッドはわかるけど、中の具体的な数値は子クラスによって違うから決められない
・中身を空にしたら、空のまま使われてしまうかもしれない。(オーバーライドしわすれorそういうものだと思う)
・継承するための高度なクラスをインスタンス化されたら大変
クラスにはnewによる利用もextendsによる利用の2つの使い方がある
解決方法
abstract
抽象メソッド
具体的にどう動くか、中身がどうなるか確定できないメソッドというにつける
public abstract void attcak(Matango m);
{}もつけずにセミコロンで終わる。
ーーーーーーーーーーーーーーーーーーーー
Unityでもあるんだ。
抽象クラスは継承して使われることを前提としているため、インスタンス化することはできません〜Unityでいうと、オブジェクトにスクリプトを付けるとインスタンス化したことになるので、オブジェクトにスクリプトを付けられないという意味です〜
オブジェクトにスクリプトを付けるとインスタンス化したことになるんだ!
ーーーーーーーーーーーーーーーーーーーーーーーーーーーー
抽象メソッドを含むクラスにもabstractを付けないといけない。
public abstract class Character{
}
abstract宣言したクラスをインスタンス化しようとするとエラーが出る
これによりabstractなメソッドをoverrideし忘れてもエラーが出るので大丈夫。
抽象クラスを継承している時点で、何かしら抽象メソッドが子クラスに継承されている。抽象メソッドがあるクラスにはabstractを付けないといけないというエラーがでる。
インタフェース
抽象メソッドしかなく、フィールドもないとっても抽象的なクラスは、別途インタフェースという名前を持つ
public interface Creature{
public abstract void run();
}
インタフェースクラスの中身は勝手にpublic abstractになるので省略してもいい。
インタフェースを継承してクラスを作る場合
public class 子クラス implements インタフェースクラス{
}
インタフェースはメニュー表。
多重継承
内部実装を一切定めていない。そのため多重継承が許されている。
ふつうは、複数のクラスから継承することはできないけど、インタフェースを複数継承するのはOK。中身が衝突することがないから
書き方は
public class 子クラス imlements 親インタフェース1,親インタフェース2,親インタフェース3{
}
インタフェースを継承してインタフェースを作る
public interface Human extends Creature{
void talk;
}
unityにもある。