Javaで大きなプログラムを作り始めると、以前作ったクラスと似通ったクラスを作る必要に迫れられことがあります。 そういったときどうすればよいでしょうか。まず、Heroクラスを見てみます。
public class Hero{
String name = "ミナト";
int hp = 100;
public void attack(matango m){
したい内容を書く
}
public void run(){
したい内容を書く
}
}
public class superHero extends Hero{
boolean flying;
public void fly(){
したい内容を書く
}
}
public class superHero extends Hero{
boolean flying;
public void fly(){
したい内容を書く
}
//これが親クラスのメンバの上書きしたい内容
public void run(){
したい内容を書く
}
}
public class Main{
public static void main(String[] args){
Hero h = new Hero();
h.run;
superHero sh = new superHero();
sh.run();
}
}
実行結果
Heroクラスのrun()の内容
superHeroクラスで上書きされたrun()の内容
public class superHero extends Hero{
public void attack(Matango m){
System.out.println(this.name+"");
m.hp -= 5;
System.out.println("");
if (this.flying){
System.out.println("");
m.hp -= 5;
System.out.println("");
}
}
}
super.フィールド名
super.メソッド名(引数)
public class Item{
String name;
int price;
public Item(String name){
//処理内容
}
public Item(String name, int price){
//処理内容
}
}
public class Weapon extends Item{//処理内容}
public class Main{
public static void main(String[] args){
Weapon w = new Weapon();
}
}
私たちは現実世界において、無意識に多くのものを抽象的に捉え、利用しています。オブジェクト指向の目的が「現実世界の再現」である以上、Javaでも 「抽象的な登場人物」を上手に捉える必要があります。ここでは、抽象的であいまいなクラスを正しく・安全に・便利に利用するために準備されているクラスの 定義方法について説明していきます。高度な継承と小難しい言い回しになっていますが、簡単に言うと他の開発者が効率よく安心して利用できる継承の材料を作ることです。 しかし、ここで2つの不都合、3つの心配事が生じます。まず以下のコードを見てください。
public class Character{
String name;
int hp;
public void run(){
System.out.println(this.name+"は逃げ出した");
}
public void attack(Matango m){
System.out.println(this.name+"の攻撃!");
m.hp -= ??;
}
}
public abstract 戻り値の型 メソッド名(引数 リスト);
public abstract class クラス名{
}
ここまで、継承階層を下にたどっていくとどうなるかを見ていきました。下がっていくたびに具体化していき、最終的に全てのメソッド につて処理内容が実装されていくのでした。では、今度は逆に、階層を下から上に昇ってみることを考えましょう。すると、上にいくにつれて「どんどんあいまいなものになっていく」、そして、「どのような内部情報を持っているか(フィールド)」 「どのような動きをするか(メソッド)」は、あやふやになり、決めることができなくなっていくのです。Javaでは、特に抽象度が高い抽象クラスを、インタフェースとして特別に扱うことができます。 インタフェースとして特別扱いできる条件は、「全てのメソッドは抽象メソッドである」「基本的にフィールドを1つも持たない」です。この時、以下のような構文を用いてインタフェースとして定義します。
public interface インタフェース名{
}
public interface CleaningService{
Shirt washShirt(Shirt s);
Towl washTowl(Towl t);
Coat washCoat(Coat c);
}
public class KyotoCleanigShop implements CleaningService{
String ownerName;
String address;
String phone;
public Shirt washShirt(Shirt s){
return s;
}
public Towl washTowl(Towl t){
return t;
}
public Coat washCoat(Coat c){
return c;
}
}
public class クラス名 implements 親インタフェース名1, 親インタフェース2, ////{
}
public class クラス名 extends 親クラス implements 親インタフェース1, 親インタフェース2, ///{
}