🤖

触って学べる図解:extendsとTraitの違いをロボット工場で例えてみた

に公開

はじめに

こんにちは!

オブジェクト指向を勉強していると、必ず出てくる extends(継承)Trait(トレイト)

「なんとなくわかるけど、どう使い分けるの?」って思いませんか?

今回は、ロボット工場に例えながら、クリックして遊べるインタラクティブな図解で、この2つの違いをざっくり理解してみましょう!

まずは触ってみよう!

百聞は一見にしかず。まずは下のカードをクリックしてみてください👇

extends(継承)とは?

extends は、親クラスの設計図を丸ごと引き継いで、新しいクラスを作る仕組みです。

class Robot {
    public function move(): void
    {
        echo "歩く";
    }
}

// BasicRobotはRobotの機能を全部引き継ぐ
class BasicRobot extends Robot {
    public function greet(): void
    {
        echo "こんにちは!";
    }
}

$robot = new BasicRobot();
$robot->move();  // 親から引き継いだ "歩く"
$robot->greet(); // 自分の "こんにちは!"

extendsのポイント

  • ✅ 親の機能を丸ごと引き継げる
  • ✅ コードの再利用がしやすい
  • 親は1つだけ(PHPは単一継承)
  • ❌ 「車」と「ロボット」を同時に親にできない

Trait(トレイト)とは?

Trait は、クラスに特定の機能だけをあとから追加できる仕組みです。
まるでロボットにオプションパーツを後付けするイメージです!

// 「飛ぶ」機能のTrait
trait CanFly {
    public function fly(): void
    {
        echo "飛んだ!";
    }
}

// 「炎を出す」機能のTrait
trait CanFlame {
    public function flame(): void
    {
        echo "炎!";
    }
}

// 複数のTraitを同時に使える!
class SuperRobot {
    use CanFly, CanFlame;
}

$robot = new SuperRobot();
$robot->fly();   // "飛んだ!"
$robot->flame(); // "炎!"

Traitのポイント

  • 複数のTraitを同時に使える
  • ✅ 欲しい機能だけをポン付けできる
  • ✅ 異なるクラスに同じ機能を共有できる
  • ❌ 単体でインスタンス化はできない(あくまで「パーツ」)

まとめ:使い分けの基準

extends Trait
イメージ 設計図の丸コピー オプションパーツの後付け
使える数 1つだけ いくつでも
向いている場面 「〇〇の一種」という関係 「〇〇できる」という機能追加
Dog extends Animal use CanSwim, CanRun

extendsとTraitの違い図解

おわりに

extendsTrait はどちらも「コードを再利用する仕組み」ですが、目的が違います。

  • extends親子関係を表す
  • Trait機能の追加に使う

この違いを意識するだけで、クラス設計がぐっとスッキリしますよ!

最初のインタラクティブ図解でも確認できるので、ぜひ何度でも触って感覚をつかんでみてください🤖

ソーシャルデータバンク テックブログ

Discussion