PHP のポリモーフィズムに関する質問

WBOY
リリース: 2016-06-23 14:04:20
オリジナル
1014 人が閲覧しました

Wikipedia にはポリモーフィズムの定義があります: オブジェクト指向言語では、インターフェイスの複数の異なる実装がポリモーフィズムです

この記事をお読みください:
http://www.cnblogs.com/tecs27/archive /2012/03/13/2394028 .html

プロセス制御を使用するコード セグメントは次のとおりです。 ポリモーフィズムを示すために、ポリモーフィズムを使用するコード スニペットを以下に示します。

class painter{                                    //定义油漆工类        public function paintbrush(){                 //定义油漆工动作            echo "油漆工正在刷漆!\n";        }    }    class typist{                                    //定义打字员类        public function typed(){                     //定义打字员工作            echo "打字员正在打字!\n";        }    }    function printworking($obj){                    //定义处理类        if($obj instanceof painter){                //若对象是油漆工类,则显示油漆工动作            $obj->paintbrush();        }elseif($obj instanceof typist){            //若对象是打字员类,则显示打字员动作            $obj->typed();        }else{                                    //若非以上类,则显示出错信息            echo "Error: 对象错误!";        }    }    printworking(new painter());                    //显示员工工作    printworking(new typist());                     //显示员工工作
ログイン後にコピー


後者のコードは統合されています。ポリモーフィズムを実現するために異なるサブクラス間でメソッド名を変更する これはポリモーフィズムの正しい例ですか? 「はい」の場合、抽象クラスを継承するすべてのサブクラスは、抽象親クラスに対して多態性を持つと理解できますか?


さらに、フォーラムの別のディスカッション スレッド (http://bbs.csdn.net/topics/390025104) で、55L の xuzuning 教師がコード例を示しました:
class employee{//定义员工父类    protected function working(){//定义员工工作,需要在子类的实现        echo "本方法需要在子类中重载!";    }}class painter extends employee{//定义油漆工类    public function working(){//实现继承的工作方法        echo "油漆工正在刷漆!\n";    }}class typist extends employee{//定义打字员类    public function working(){        echo "打字员正在打字!\n";    }}class manager extends employee{//定义经理类    public function working(){        echo "经理正在开会!";    }}function printworking($obj){//定义处理方法    if($obj instanceof employee){//若是员工对象,则显示其工作状态        $obj->working();    }else{//否则显示错误信息        echo "Error: 对象错误!";    }}printworking(new painter());//显示油漆工的工作printworking(new typist());//显示打字员的工作printworking(new manager());//显示经理的工作
ログイン後にコピー


このコード内の変数 $ An example a は最初に親クラス Animal として宣言されているため、出力は「未定義」になり、次にサブクラス Cat および Dog として宣言されます。次に、Cat が宣言されると、変数 $a は Cat のインスタンスを指すため、$a-> になります。は ;talk() と呼ばれ、実際には Cat's talk を呼び出しています。同様に、$a が Dog のインスタンスとして宣言されると、cat オブジェクトは上書きされます。 xuzuning 先生は投稿の中で、親オブジェクトは現在割り当てられている子オブジェクトの特性に応じてさまざまな方法で動作できると述べましたが、このコードは $a が親クラスのステップを通じて talk メソッドを呼び出すことを示しているわけではなく、新しい1. オブジェクトは前のオブジェクトを上書きし、新しいオブジェクトのすべてのメソッドが呼び出されます。では、xuzuning 先生からのこのコード例は不適切なのでしょうか?


最近、ポリモーフィズムの具体的な実践について混乱していることがあります。いくつかの記事では、必須の型定義の必要性について言及しており、ある記事では、特定のクラスから継承しているかどうかを判断するためにサンプル コードで instanceof キーワードを使用しています。明確な定義とコード例を示し、上記のコード例がポリモーフィックな実践であるかどうかを答えることができる教師は誰でしょうか?



ディスカッションへの返信 (解決策)

どの例でも機能します。最初の例はより一般的で、サブクラスの実装を確実にするために親クラスで仮想関数を使用するのが最善です。ポリモーフィズムは「同じインターフェイス」、「異なる実装」です。その他の詳細については心配しないでください...

どのような例でもかまいません。最初の例はより一般的です。確実に実行するには、親クラスで仮想関数を使用するのが最善です。サブクラスの実装

ポリモーフィズムの鍵は、「同じ「インターフェース」、「異なる実装」です。その他の詳細は気にしないでください...

先生、ありがとうございます。PHP には仮想関数はありますか?

php では抽象関数と言うべきです...
http://www.php.net/manual/en/ language.oop5.abstract.php

Comprehension Comprehension Comprehension....

これは少し似ています仏教の経典には何が書いてあるのか 概念は抽象的です 抽象的な具体的な動作を記述するには抽象メソッドを使用します...へへ


しかし、このコードでは $a が親クラスを介して talk メソッドを呼び出していることがわかりません。ステップですが、前のオブジェクトは新しいオブジェクトのメソッドをすべて呼び出します。 print_r($a); 誰が誰なのかすぐにわかります

php では、抽象関数と言うべきです...

http://www.php.net/manual/en/ language.oop5.abstract .php

Virtual この関数は静的遅延バインディングだと言っている人もいますが、私はそれのように見えると思います。なぜ抽象関数はサブクラスの実装を保証できるのでしょうか?

投稿者 chenlong451 からの返信を引用: しかし、このコードは $a が親クラスのステップを通じて talk メソッドを呼び出すことを示していません。代わりに、新しいオブジェクトが前のオブジェクトをカバーし、新しいオブジェクトのメソッドが完全に呼び出されます。 print_r($a); 誰が誰なのかすぐにわかります

xuzuning 先生が来ました、ヒントをありがとう。

print_r 後の結果は

class Animal {  var $voice = '未定义';  var $root;  function __construct() {    $this->root = $this;  }  function signal($o) {    $this->root = $o;  }  function Talk() {    echo $this->root->voice;  }} class Cat extends Animal {  var $voice = '喵';} class Dog extends Animal {  var $voice = '汪汪';} $a = new Animal;  $a->Talk();    $a->signal(new Cat);$a->Talk(); $a->signal(new Dog);$a->Talk();
ログイン後にコピー

オブジェクト配列となり、親クラスの voice static 属性は保持されます。どうしたの?なぜそれをカバーしないのですか?


なぜ取材なのか?
理由を教えてください

なぜ取材するのですか?
理由を教えてください

わかりました、コードを注意深く読んでいませんでした。恥ずかしい。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート