「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典イメージぴよ画像「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典

オーバーライド

pointこの用語のポイント

point親クラスのメソッドを上書きするよ

point親クラスにあるメソッドを子クラスで再定義するよ

pointオブジェクトの継承に関する話で出てくるよ

スポンサーリンク

簡単に書くよ

オーバーライド(英:override)とは

オブジェクト指向(「モノ」に注目した考え方)における継承(元ネタの要素を受け継ぐこと)の話で出てくる用語のひとつ
であり

親クラス(元からあった方(継承元)のクラス)にあるメソッド(「オブジェクトの操作を定義したもの」だけど、動きとしては関数と同じ)を子クラス(新しく作られた方(継承先)のクラス)で再定義することによって、子クラス上で親クラスのメソッドを上書きすること
です。


image piyo

詳しく書くよ

順番に見ていきましょう。
まずは予備知識として

関数
オブジェクト指向
クラス
メソッド
継承
親クラス
子クラス


について結構ガッツリ説明します。
「そんなの説明されなくても知ってるよ!」な人は適当に読み飛ばしてください。

関数は「何かを入れると何かをやって何かを返してくれる、処理のまとまり」です。
一般的には、入力を受けて処理をやり、その結果として出力があります。

オーバーライド

ついでなので書いておくと、関数に入れる値は「引数(ヒキスウ)」と言います。

オーバーライド2

関数から出てくる値は「戻り値」です。

オーバーライド3

ちょっと汚い話で恐縮ですが、人間は、ご飯を食べて、ウンチを出します。

オーバーライド4

人間が関数だと考えてください。
ご飯に相当するものが引数です。
ウンチに相当するものが戻り値になります。

オーバーライド5

オブジェクト指向は「『モノ』に注目した考え方」です。
「どんなやつで、どう動く」に注目した考え方です。

オーバーライド6

詳細は、用語「オブジェクト指向」の説明を ご覧ください。

オーバーライド7

オブジェクト指向の理念に沿って作られたプログラミング言語を「オブジェクト指向プログラミング言語」と言います。
有名どころでは、Javaなんかがオブジェクト指向プログラミング言語です。

オブジェクト指向プログラミング言語では

クラス
インスタンス
オブジェクト


の3つの用語が よく出てきます。
この3つは とても大事です。
ざっくりとで良いので関係性を覚えておいてください。

専門家の人からは怒られそうですが、ものすごい大雑把に説明すると

クラス:設計図
インスタンス:実際に作った物
オブジェクト:モノ(クラスとかインスタンスとかを、ふんわりと表現したもの)


です。

クラスは「設計図」です。
「それって、どんなもの?」を示しています。
ピヨ太君の頭の中にある「ピヨピヨ時計は こんな感じだな」がクラスです。

オーバーライド8

インスタンスは「実際に作ったもの」です。
クラス(設計図)に書かれた「それって、どんなもの?」を形にしたものを指します。
実際に作ったピヨピヨ時計がインスタンスです。

オーバーライド9

オブジェクトは……モノですよ、モノ。
結構ざっくりとした使われ方をする用語です。
「クラスとかインスタンスを ふんわりと表現したもの」くらいに解釈してください。
よく分からない人は忘れてしまって かまいません。

オーバーライド10

メソッドは、教科書的な説明をすれば「オブジェクトの『操作』を定義したもの」です。
ただし、今回は

クラス内に定義した関数のこと

と解釈してください。
その方がイメージしやすいと思います。

継承は「元ネタから要素を受け継いで、元ネタの特徴を備えた新しいのを作ること」です。

例えば、そうですね。
ここにピヨ太ママがいたとしましょう。

オーバーライド11

ピヨ太ママの要素を受け継いだピヨ太君を新しく作りました。
ピヨ太君にはピヨ太ママの特徴が色濃く受け継がれています。

オーバーライド12

これが継承です。
継承元(ピヨ太ママ)から要素を受け継いで、継承元の特徴を備えた新しいの(ピヨ太君)を作る行為です。

なお、このときのピヨ太ママとピヨ太君は「親子関係にある」と言います。

オーバーライド13

ピヨ太ママはピヨ太君の「」です。

オーバーライド14

ピヨ太君はピヨ太ママの「」になります。

オーバーライド15

継承の考え方はクラスにも当てはめられます。
ピヨ太ママクラスを継承して、ピヨ太ママクラスの特徴を備えたピヨ太君クラスを新しく作れるのです。

オーバーライド16

このときの最初からいた方、ピヨ太ママクラスを「親クラス」と言います。

オーバーライド17

新しく作られた方のピヨ太君クラスは「子クラス」です。

オーバーライド18

せっかくなので、もう少しプログラミングちっくな例も載せておきましょう。

例えば、Javaで書いた以下のソースコード(人間語で書いたプログラムの元ネタ)があったとします。

//ピヨ太ママクラス
class PiyotaMama{
    public String seikaku="キレたら怖い";
}

//ピヨ太君クラス
class Piyota extends PiyotaMama{
    public String syumi="昼寝";
}

//主処理
public class test{
    public static void main(String[] args){
        //太君クラスのインスタンス「piyota」を生成
        Piyota piyota = new Piyota();

        //表示
        System.out.println("ピヨ太君の性格:" + piyota.seikaku);
        System.out.println("ピヨ太君の趣味:" + piyota.syumi);
    }
}


このソースコード内の

//ピヨ太ママクラス
class PiyotaMama{
    public String seikaku="キレたら怖い";
}

//ピヨ太君クラス
class Piyota extends PiyotaMama{
    public String syumi="昼寝";
}


が継承しているところです。

class Piyota extends PiyotaMama{



「PiyotaMama」クラスを継承(extends)した「Piyota」クラス

を意味しています。

継承元の「PiyotaMama」クラスが親クラスです。
継承先の「Piyota」クラスが子クラスになります。

        //表示
        System.out.println("ピヨ太君の性格:" + piyota.seikaku);
        System.out.println("ピヨ太君の趣味:" + piyota.syumi);


の部分は、実際にピヨ太君クラス(を実体化したもの)を使っているところです。
ピヨ太君クラスには「seikaku」がありません。
ですが、親クラスのピヨ太ママクラスに「seikaku」があります。
ピヨ太ママクラスの要素を受け継いでいるピヨ太君クラスには見えないだけで「seikaku」があるのです。

以上を踏まえて、本題に入ります。

継承すると親クラスで定義されているメソッドを子クラスで使えます。
親クラスの要素を受け継いでいるからです。

オーバーライド19

ただし、親クラスのメソッドと同じ名前のメソッドを子クラスでも用意することでメソッドの動きを変えられます。
同じメソッドを再定義することで(子クラス上では)上書きできるのです。

オーバーライド20

この

親クラスで用意されているメソッドを子クラスで再定義することで上書きする

のが「オーバーライド」です。

オーバーライド21

例えば、そうですね。

ピヨ太ママクラスが「必殺技発射」メソッドを持っているとしましょう。
ピヨ太ママの必殺技は「ぴよぴよ波」です。
ピヨ太ママクラスの中には

「必殺技発射」メソッド:ぴよぴよ波を放つ

と書かれています。

オーバーライド22

次にピヨ太ママクラスを継承したピヨ太君クラスを作りました。
ピヨ太君クラス自体は「必殺技発射」メソッドを持っていません。

オーバーライド23

ただし、ピヨ太君クラスを指定して「必殺技発射」メソッドを実行できます。
ピヨ太ママクラスの要素を継承しているからです。
ピヨ太君クラスを指定して「必殺技発射」メソッドを実行すると、ピヨ太ママクラスで定義されている「必殺技発射」メソッドが実行されるので、ぴよぴよ波が放たれます。

オーバーライド24

ある日のことです。
ピヨ太君は自分専用の必殺技「ピヨシウム光線」を閃きました。

オーバーライド25

ピヨ太君クラスの中には

「必殺技発射」メソッド:ピヨシウム光線を放つ

と書かれました。
これでピヨ太君が放つ必殺技はピヨシウム光線です。

この状態でピヨ太君クラスの「必殺技発射」メソッドを実行すると、ピヨシウム光線が発射されます。
ぴよぴよ波では ありません。

オーバーライド26

これがオーバーライドです。
親クラスのメソッドを子クラスで再定義する行為を指します。

せっかくなので、もう少しプログラミングっぽい例も載せておきますね。

例えば、Javaで書いた以下のソースコードがあったとします。

//ピヨ太ママクラス
class PiyotaMama{
    public void hissatuwaza(){
        System.out.println("ぴよぴよ波!");
    }
}

//ピヨ太君クラス
class Piyota extends PiyotaMama{
}

//主処理
public class test{
    public static void main(String[] args){
        //ピヨ太君クラスのインスタンス「piyota」を生成
        Piyota piyota = new Piyota();

        //必殺技発射!
        piyota.hissatuwaza();
    }
}


このプログラムを実行すると、画面には

ぴよぴよ波!

と表示されます。

「Piyota」クラスには「hissatuwaza()」メソッドがありませんが、継承元である「PiyotaMama」クラスには「hissatuwaza()」メソッドがあります。
「Piyota」クラスの「hissatuwaza()」メソッドを指定すると、継承元である「PiyotaMama」クラスの「hissatuwaza()」メソッドが実行されるのです。

次に、処理の内容を以下のように書き換えてみました。

//ピヨ太ママクラス
class PiyotaMama{
    public void hissatuwaza(){
        System.out.println("ぴよぴよ波!");
    }
}

//ピヨ太君クラス
class Piyota extends PiyotaMama{
    public void hissatuwaza(){
        System.out.println("ピヨシウム光線!");
    }

}

//主処理
public class test{
    public static void main(String[] args){
        //ピヨ太君クラスのインスタンス「piyota」を生成
        Piyota piyota = new Piyota();

        //必殺技発射!
        piyota.hissatuwaza();
    }
}


「hissatuwaza()」メソッドを「Piyota」クラス内で再定義しました。
これで「hissatuwaza()」メソッドは「PiyotaMama」クラスにもあるし「Piyota」クラスにもある状態になります。

書き換えた後のプログラムを実行すると、画面には

ピヨシウム光線!

と表示されます。
「Piyota」クラスの「hissatuwaza()」メソッドが実行されましたね。

ここまで長々と説明してきましたが、動き自体は単純です。

1.指定されたクラスに該当するメソッドがあったら、それを実行する
2.なかったら、親クラスに探しに行く


だけです。

元々は指定されたクラスに該当するメソッドがないので親クラスに探しに行っていたけど指定されたクラスにメソッドを定義することで親クラスに探しに行かなくなる(=子クラスで定義したメソッドが実行される≒親クラスのメソッドが上書きされる)のがオーバーライドです。


image piyo2

一言でまとめるよ

まぁ「オーバーライド」って単語が出てきたら「子クラス(新しく作られた方(継承先)のクラス)で親クラス(元からあった方(継承元)のクラス)のメソッド(「オブジェクトの操作を定義したもの」だけど、動きとしては関数と同じ)を再定義するんだな~」と お考えください。

一番上に戻るよ
スポンサーリンク
書籍画像077
書籍画像031

おまけ

■訳してみるよ

「override(オーバーライド)」の意味は

・無視する
・くつがえす
・無効化する


とかです。
元々あるのを無効化して新しく定義するイメージですかね。





書籍画像
わわわ説明術コラム
宣伝だよ
7日間でハッキングをはじめる本 TryHackMeを使って身体で覚える攻撃手法と脆弱性
「分かった!」と思わせる説明の技術 知識ゼロの相手にも伝わるようになる本【Audible】
実践サイバーセキュリティ入門講座 現場に残された痕跡からハッカーの攻撃を暴け