>  > カーマット フロアマット トヨタ カローラアクシオ(セダン) 27年3~ 2WD/MT-シャギーマルーン

カーマット YAMAHA フロアマット トヨタ カローラアクシオ(セダン) 27年3~ ハウジングセツトR.*RP38M*オデッセイ 2WD/MT-シャギーマルーン

カーマット 2WD/MT-シャギーマルーン 27年3~ フロアマット トヨタ カーマット 27年3~ カローラアクシオ(セダン)

オブジェクト指向のメリットとしてよく言われることの中にポリモーフィズムというのがあります。
日本語では多様性とか訳されます。

要は、異なる動作を同じ操作で実現することです。
家電でたとえてみましょう。
どのような家電も、動かすのにスイッチを押すという操作が共通します。しかし当然、スイッチを押す事による動作は家電ごとに違います。

ポリモーフィズムはこれをプログラミングに取り入れたようなものです。

本来ポリモーフィズムは型と深い関わりがありますが、
PHPにおいては型の存在意義が少し薄いので、Javaとかとは多少性格が異なります。
PHPの場合、一言で言えばクラスは異なっても同じ名前のメソッドでいろんな動きを実現させる事です。
それにはインターフェイスが絡んできます。

ポリモーフィズムの考え方

実は、インターフェイスの説明のところのサンプルコードがまさにポリモーフィズムです。カートと商品の例です。
この例では、カートのメソッドは、引数で受け取る商品クラスが、ある特定のメソッドを必ず持っている前提での処理になっており、それを保証するために商品クラスがインターフェイスを実装する、というものです 『キャラバン』 純正 VPE25 ウィンドウガードバー ロングボディ車用 M6TZ2 パーツ 日産純正部品 CARAVAN オプション アクセサリー 用品。

カーマット フロアマット トヨタ カローラアクシオ(セダン) 27年3~ 2WD/MT-シャギーマルーン,[#tong##]

各車種専用カットで素材・縫製に拘ったオリジナルフロアマットです。耐久性や耐磨耗性、耐火性など、純正品さながらの高品質。水洗いはもちろんマット洗浄機もご使用になれます。また、お求めやすいリーズナブルな価格に設定。工場で直接開発をしていますので、車種専用なのにロープライスを実現!! また、従来にないカラーバリエーションや材質で、人と違ったインテリアコーディネイトが楽しめます。◆1台分1セット ◆フック対応 ※旧車は穴位置が異なる場合がございます。 ※ヒールパッドの有無に関してご希望がある場合にはご注文時にお申し付けください。※生地は、染色ロット、パソコン環境等により、実際のカラーと異なる場合がございますので予めご了承下さい。※生地裁断によって柄の出方が変わります。お手元に届く商品が写真の柄の出方と異なる場合がございます。 ※納期:受注生産のため、1~2週間程度。完全受注生産のためご注文後のキャンセル・返品は不可。※代引き不可対応車種 : 27/3~ カローラアクシオ(セダン) NZE161 2WD/MT



インターフェイスや抽象クラスで、抽象メソッドとする理由はなんでしょう。

それは、必ず存在しなければならない手続きだけど、その中身は実装先のクラス内で好きなようにしていいよ、ってことです。異なる部分だけ実装を促すわけです。そうしておけば後の事は深く考えなくても良いってことです。

カートと商品の例だと、カートに商品を追加した瞬間に、商品のapplyPriceDownというメソッドが実行されますが、野菜の場合は常に3割引、肉の場合は特定の日のみ半額、冷凍食品に至っては何もしないというように、それぞれapplyPriceDownでやっている処理はバラバラです。

これがポリモーフィズムです。

タイプヒンティング

PHPでは型の曖昧さが一つの特徴です。
しかし、型を明確にしたい場合ってあります。

例えばインターフェイスのところのカートの例であれば、addProductメソッドは商品クラスのインスタンスを引数で受け取る事が前提になっています 送料無料 オリジナルフロアマット プレミアムデラックス TOYOTA トヨタ CROWN HDTOP クラウン ハードトップ H7/8~H11/9 車種別 カーマット 床 車 ポイント消化。しかし仮にこの引数になんか適当な、たとえば文字列とかを指定したらどうなるでしょう。当然おかしなことになります。

カートクラスにとっては、引数で受け取る変数は商品クラスインスタンスであることを保証したいところです。
それを実現するのが「タイプヒンティング」です。

 
 // 商品追加
 public function addProduct(Meet $product)
 { 
 $product->applyPriceDown(); 
 $this->products[] = $product;
 }


カートのaddProductメソッドですが、引数の左にクラス名を記述します。
これで、引数$productはMeetクラスのインスタンス以外は受け付けなくなります。

この例の場合、Meetクラスはいいとしても、Vegetableクラスは受け付けてくれません。
しかし素晴らしいことに、このタイプヒンティングにはインターフェイスを指定する事が出来ます

 // 商品追加
 public function addProduct(IProduct $product)
 { 
 $product->applyPriceDown(); 
 $this->products[] = $product;
 }


こうすると、引数にはIProductを実装するクラスのインスタンスならなんでも可能になります。つまりVegetableとMeetとFreezedFoodが可能になるのです。

ポリモーフィズムを意識してクラス設計する上では有効な仕組みです LEONIS MX/レオニスMX 日産 ステージア M35 アルミホイール 1本 【20×8.5J 5-114.3 INSET45 PBMC/TI】。

ちなみにこのタイプヒンティングにはクラスまたは配列のみ指定できます。普通のstringとかintとかいうような型は指定できません。

タイプヒンティングにより、以下のようなメリットがあるといえます。

  • クラス設計者はインターフェイスの仕様にもとづいてメソッドが作成できる
  • クラス使用者はメソッド実行の際の引数に何を渡せばよいかを調べる必要がない

つまり、クラス設計者の意図がクラス使用者に伝わりやすいという事です。

ポリモーフィズムのコーディング上の利点

実質的な利点な上のようなことですが、ポリモーフィズムをうまく利用するとコーディングが非常にシンプルに、綺麗になります 【送料無料】 215/45R17 17インチ BRANDLE-LINE ブランドルライン カルッシャー ブラック/リムポリッシュ 7J 7.00-17 DUNLOP ダンロップ エナセーブ EC204 サマータイヤ ホイール4本セット 。
本来ならifやswitch等で条件分岐を行い、長たらしくなりそうなロジックが、ポリモーフィズムを利用するとそのような条件分岐が排除され、シンプルになるわけです。

ポリモーフィズムを利用するパターンとしないパターンを比較してみましょう。

ポリモーフィズムなし
<?php
// 商品クラス
class Product
{
 const VEGETABLE = 'vegetable';
 const MEET = 'meet';
 const FREEZED = 'freezed';
 private $prices = array(
 self::VEGETABLE => 1000,
 self::MEET => 2000,
 self::FREEZED => 500,
 );
 private $productType;
 public function __construct($productType)
 {
 $this->productType = $productType;
 }
 public function applyPriceDown()
 {
 switch ($this->productType) {
 case self::VEGETABLE:
 // 常に3割引
 $this->price = $this->price * 0.7;
 break;
 case self::MEET:
 // 29日なら半額
 if ('29' == date('d')) {
 $this->price = $this->price / 2;
 }
 break;
 }
 }
}
// カートクラス
class Cart
{
 // 商品インスタンス保持用配列
 private $products = array();
 // 商品追加
 public function addProduct($product)
 { 
 $product->applyPriceDown(); 
 $this->products[] = $product;
 }
}
$vegetable = new Product(Product::VEGETABLE);
$meet = new Product(Product::MEET);
$freezed = new Product(Product::FREEZED);
$cart = new Cart();
$cart->addProduct($vegetable);
$cart->addProduct($meet);
$cart->addProduct($freezed);
?>


ポリモーフィズムを利用
<?php
// 商品インターフェイス
interface IProduct
{
 public function applyPriceDown();
}
// 野菜クラス
class Begetable implements IProduct
{
 private $price = 1000;
 public function applyPriceDown()
 {
 // 常に3割引
 $this->price = $this->price * 0.7;
 }
}
// 肉クラス
class Meet implements IProduct
{
 private $price = 2000;
 public function applyPriceDown()
 {
 if ('29' == date('d')) {
 // 29日なら半額
 $this->price = $this->price / 2;
 }
 }
}
// 冷凍食品クラス
class FreezedFood implements IProduct
{
 private $price = 500;
 public function applyPriceDown()
 {
 // 値引きなし
 }
}
// カートクラス
class Cart
{
 // 商品インスタンス保持用配列
 private $products = array();
 // 商品追加
 public function addProduct($product)
 { 
 $product->applyPriceDown(); 
 $this->products[] = $product;
 }
}
$vegetable = new Vegetable();
$meet = new Meet();
$freezed = new FreezedFood();
$cart = new Cart();
$cart->addProduct($vegetable);
$cart->addProduct($meet);
$cart->addProduct($freezed);
?>


ポリモーフィズムなしのパターンは少しapplyPriceDownが少しゴチャついた感じがしませんか?処理がごく簡単なものなので違いはまだ大した事ありませんが、大規模な処理になってくると違いが大きく出てきます。

対してポリモーフィズム利用ではクラスの数は増えますが、一つ一つがとても単純になっているのがわかると思います。
switchによる処理分岐がなくなったからです (ルナインターナショナル) エスティマ ACR30W/ACR40WMCR30W/MCR40W [2003/5~2005/12 (後期)] ブラックカーボン ガングリップ ウッド&レザーステアリング。

プログラミングって、条件分岐や制御構造が多いほど読みにくくなります。それを極力減らすという意味でもポリモーフィズムは有効です。

カーマット フロアマット トヨタ カローラアクシオ(セダン) 27年3~ 2WD/MT-シャギーマルーン

{yahoojp} {objective-php.net}
{yahoojp}jpprem01-zenjp40-wl-zd-21058