オブジェクト指向って何?
そもそもオブジェクト指向って何か、スパっと言い切れますか?
私は先生から「こんな感じで作っていくんだよ」とPython言語を用いて教わりましたが、今現在「オブジェクト指向って何なの?」と聞かれると説明出来ないな、と思い、自分の中の整理も兼ねて書き連ねることにします。(記事内に現れるコードはPythonをもとにしています)
Qiitaにおける他の方のオブジェクト指向解説と盛大に被っているかもしれませんが、お目こぼしをお願いします。言語に起こす事で思考を整理することがこの記事の主目的です。もしよろしければ、モニターの前で「なるほどね」「私はこう思うな」なんて相槌をお願いします。(そして明らかなミスがあれば指摘をお願いします……)
「オブジェクト」=「object」=「物体」を考えるということ
「オブジェクト指向って何?」という問いに対しての返答は、現在私の中では「プログラムの中身を物として考える考え方の事。物を作って、他の事に流用すると次のものを作るのが簡単で……」と煩雑なものです。
私の中にある考え方、「物として考える」。具体的にはどういうことなのでしょう?ボールを例に挙げて、プログラムと紐づけてみましょう。
「ボール」にはいっぱい種類がある![:soccer: :soccer:](https://cdn.qiita.com/emoji/twemoji/unicode/26bd-fe0f.png)
![:baseball: :baseball:](https://cdn.qiita.com/emoji/twemoji/unicode/26be-fe0f.png)
![:volleyball: :volleyball:](https://cdn.qiita.com/emoji/twemoji/unicode/1f3d0.png)
![:football: :football:](https://cdn.qiita.com/emoji/twemoji/unicode/1f3c8.png)
![:tennis: :tennis:](https://cdn.qiita.com/emoji/twemoji/unicode/1f3be.png)
(クラスの作成)
サッカーボール、野球ボール、バレーボール、ラグビーボール、テニスボール、バスケットボール。これらはそれぞれ特徴があります。だから、全く別のものです。でも、全部ボールです。
この、ボールというひとくくり、これがclass
です。
でも、種類によって名前、大きさ、素材や使い方、もちろん作り方だって全然違います。だから、「ボールを作るんです!」って宣言するときに必要な情報はたくさんあります。
class ボール():
def __init__(self,名前,大きさ,素材,使い方,作り方):
self.名前 = 名前
self.大きさ = 大きさ
self.素材 = 素材
self.使い方 = 使い方
self.作り方 = 作り方
これでボールを作る準備が整いました。一つ、ボール
を作ってみましょう。
ボールA = ボール('サッカーボール','大き目','合成革','蹴って遊ぶ','手縫い')
これで、ボールA、蹴って遊ぶためのサッカーボールが作られました!なんと手縫いで!
さらに、「野球ボール」にもいっぱい種類がある(クラスの継承)
さて、これで一安心、いろんなボールをちまちま作っていると「ちょっと待ってよ」って声がかかります。
「野球ボールって、軟式ボールと硬式ボールっていう種類があるんじゃないの?」
さて、困りました。軟式ボール、硬式ボールなんて分類はclass ボール
にはありません。これでは作られた野球ボールが軟式なのか、硬式なのかわかりません。野球ボールのためだけにclass ボール
に新しい分類を作らないといけないのでしょうか? それともまた一から野球ボール用に新しいclass
を作り、self.名前=名前
とちまちま書いていかないといけないのでしょうか……
いいえ、そんな必要はありません。野球ボールという枠をボールをもとに作ればいいのです。これがclass
の継承です。
コードを書くときはこんなふうな感じになります。
class 野球ボール(ボール):
def __init__(self,大きさ,素材,使い方,作り方,種類):
super().__init__('野球ボール',大きさ,素材,使い方,作り方)
self.種類 = 種類
super().__init__('野球ボール',大きさ...作り方)
の部分では、class 野球ボール(ボール)
の()
の中、つまりボールというclass
、枠にいろんな情報を当てはめています。そして、一行下側に新しく、種類を分類するための枠が追加されました!これからは、野球ボールは野球ボールの枠で作ります。
もちろん、ボールの枠組みはそのままです。だから、バレーボールを作るときは、ボールの枠を使います。
ボールB = 野球ボール('小さめ','ゴム','投げて遊ぶ','溶かして固める','軟式')
ボールC = ボール('バレーボール','中くらい','合成革','打って遊ぶ','手縫い')
これでボールB、軟式の野球ボールが作られました。ボールCはバレーボールです。
つまり、オブジェクト指向って何だったの?
私の思考は少しだけ整理されました。私の考える「オブジェクト指向」という考え方はどうやら枠組みを作って当てはめていくことだったようです。
もしかすると、「いやいや、自分は違うと思うよ」っていう方がいるかもしれません。もしよろしければあなたのオブジェクト指向をお聞かせください。見識が広がることはとても嬉しいことです。