アプレンティス11期生の吉川です。
本記事ではオブジェクト指向についてまとめます。
復習および、現時点での自分の認識を再確認する目的もあります。
オブジェクト指向のキホンのキ
とりあえずオブジェクト指向のコードを見てみましょう(PHP)。
まず、オブジェクトを作るには、クラスという設計図が必要です。(↓)
<?php
class Fruit
{
public $color;
public $weight;
public function eaten()
{
echo "うわっ、食べられた!";
}
}
それでは設計図をもとにオブジェクトを作りましょう。(↓)
<?php
$apple = new Fruit();
$apple->color = "赤";
$apple->weight = 150;
$apple->eat(); //うわっ、食べられた!
Fruitという設計図を用いてappleというオブジェクトが作れましたね。
解説
color(色)やweight(質量)はいろいろな果物(オブジェクト)を設計するうえで重要な状態、属性ですよね。そういうのをプロパティと言います。
要はオブジェクトをつくるときに、そのオブジェクトの状態を表す変数って大事ですよね。そういう大事な変数を設計図(クラス)に書いておくんです。
eatenというのは、食べられる、という果物の振る舞い(アクション)です。これをメソッドと言います。オブジェクトがとるアクションも設計図に書いておきます。
車なら前に進むメソッドやバックのメソッド、嫌な上司ならネチネチ説教するメソッドなんかが考えられますね。
さて、設計図ができたらあとはそれに従ってオブジェクトを作るだけです。これは簡単ですね。
PHPではnewというのを使ってオブジェクトを作ることができます。
なんだオブジェクト指向って簡単じゃん!!
重要な3つの概念(カプセル化、継承、ポリモーフィズム)
オブジェクト指向の基本が理解できたところで、もう少し込み入った話をします。
それはオブジェクト指向における3つの重要な概念である、カプセル化、継承、ポリモーフィズムです。
概念といいつつも、具体的なコードを見たほうが早いです。
カプセル化
カプセル化は隠すこと、情報隠蔽です。外から直接触れないようにします。
コードを見てみましょう。
<?php
class Human
{
private $body_weight = 0;
public function measure($record)
{
$this->body_weight += $record;
}
public function getWeight()
{
return $this->body_weight;
}
}
$takeshi = new Human();
$takeshi->measure(60);
//$takeshi->body_weight = 100; ←これはエラー
echo $takeshi->getWeight();
privateが外から直接触れないようにするためのキーワードです。
メソッドを通じて安全に操作することができます。
カプセル化によってデータの不正な操作を防ぐことができます。安全性が高まったりなど、様々なメリットがあります。
継承
継承は文字通り継承することです。
あるクラスをもとに、新しいクラスを作りたいときに活躍します。
コードを見てみましょう。
<?php
class Animal
{
public function eat()
{
echo "食べています\n";
}
}
class Dog extends Animal
{ // Animalを継承
public function bark()
{
echo "ワン!\n";
}
}
$dog = new Dog();
$dog->eat(); // => 食べています(親の機能を使える)
$dog->bark(); // => ワン!(自分の機能)
extendsを使うと親クラスを引き継げます。なので親クラスのAnimalが持っているプロパティやメソッドは子クラスのDogも持っています。
さらに子クラスにだけ独自のプロパティやメソッドを持たせることができます。
親クラスから子クラスにかけてより具体的になった感じですね。
動物→犬→ポメラニアンのように重ねて継承することもできます。
継承することで親の性質を引き継げるので同じ部分を何回もコピペしなくていいのがメリットです。
ポリモーフィズム
ポリモーフィズムは日本語だと多態性です。
いろんな状態を取れる性質ってことですね。
例えば、同じ鳴きなさいという命令でも、犬ならワンワン、猫ならニャーと鳴かせることができるのです。
コードを見てみましょう。
<?php
class Animal
{
public function speak()
{
echo "???\n";
}
}
class Dog extends Animal
{
public function speak()
{
echo "ワン!\n";
}
}
class Cat extends Animal
{
public function speak()
{
echo "ニャー!\n";
}
}
$animals = [new Dog(), new Cat()];
foreach ($animals as $a) {
$a->speak(); // それぞれ違う結果になる
}
コードを見ればわかるように、さっきの継承を行っていますね。
注目してもらいたいのが、親のAnimalのspeakと同じメソッド名を子のDogやCatも持っていることです。
同じメソッド名の場合、メソッドの内容は子クラスの内容で上書きされます。
よって出力は以下のようになります。
ワン!
ニャー!
同じspeakというメソッドでも振る舞いが変わりましたね。
このポリモーフィズムによって柔軟性・拡張性が高まります。
| 概念 | 意味 | 目的 |
|---|---|---|
| カプセル化 | データを守る | 安全性を高める |
| 継承 | 親の機能を受け継ぐ | 再利用、効率化 |
| ポリモーフィズム | 同じ命令でも振る舞いが変わる | 柔軟性、拡張性 |
まとめ
オブジェクト指向について、かなり平易に解説しました。
オブジェクト指向はまだまだ知るべき内容がたくさんあるので、学習を続けていきたいですね。