ホームページ  >  記事  >  バックエンド開発  >  PHP オブジェクト指向ポリモーフィズムを説明する例、オブジェクト指向を説明する例_PHP チュートリアル

PHP オブジェクト指向ポリモーフィズムを説明する例、オブジェクト指向を説明する例_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-13 10:20:34859ブラウズ

PHP のオブジェクト指向ポリモーフィズムを例で説明する、オブジェクト指向ポリモーフィズムを例で説明する

ポリモーフィズムとは何ですか?

ポリモーフィズムは、データベースの抽象化と継承に続くオブジェクト指向言語の 3 番目の機能です。ポリモーフィズムは複数の形式を指し、複数の形式を表現する能力を持っています。オブジェクト指向では、オブジェクトのタイプに応じて表現が異なる方法で処理されます。ポリモーフィズムにより、各オブジェクトが独自の方法で共通のメッセージに応答できます。ポリモーフィズムにより、ソフトウェアの柔軟性と再利用性が向上します。

doing() メソッドを作成すると、学生であれば授業用に印刷され、会社員であれば仕事用に印刷されます。

一般的な方法

ifを使って判断する

コードをコピーします コードは次のとおりです:

/**
* PHP ポリモーフィズム
*瓊台ブログ
​*/

// 学生クラスを定義します
クラスの生徒{
パブリック関数 cla(){
echo "学生労働者は授業中です!
";
}
}

// スタッフクラスを定義します
クラスオフィス{ パブリック関数 Wor(){
echo "スタッフは仕事中です!
";
}
}

// オブジェクトの種類を決定するメソッド
実行中の関数($obj){
If($obj 生徒のインスタンス){
$obj->cla();
}elseif($obj インスタンスオブオフィス){
$obj->wor();
}その他{
echo "そのようなオブジェクトはありません!";
}
}

doing(new students()); // 学生は授業中です
doing(new office()); // 従業員は働いています

上記の結果出力:

生徒たちは授業中です

スタッフが働いています

この通常の方法には欠点があります。つまり、オブジェクトが多数ある場合、if..else.. は非常に長く、柔軟性がなくなるということです。



ポリモーフィズムの実践

パブリック抽象メソッドを定義すると、すべてのサブクラスがそれを継承します。


コードをコピーします コードは次のとおりです:
/**
* PHP ポリモーフィズム
*瓊台ブログ
​*/

//パブリッククラスを定義します
クラスパブ{
保護された関数が動作中(){
echo "このメソッドはサブクラスでオーバーロードする必要があります!";
}
}

// 学生クラスを定義し、パブリッククラス pub を継承します
クラスの生徒がパブを拡張します{
パブリック関数 working(){
echo "学生労働者は授業中です!
";
}
}

// スタッフクラスを定義し、パブリッククラス pub を継承します
学級事務室がパブを拡張{
パブリック関数 working(){
echo "スタッフは仕事中です!
";
}
}

// オブジェクトの種類を決定するメソッド
実行中の関数($obj){
if($obj instanceof pub){
$obj->working();
}その他{
echo "そのようなオブジェクトはありません!";
}
}

doing(new students()) // 生徒は授業中です
doing(new office()); // 従業員は働いています

これがポリモーフィズムの特徴である柔軟な再利用です。


その他の方法 ポリモーフィズムの実装の観点から見ると、統一された効果を達成するために各クラスが親クラスのメソッドをオーバーライドする必要があるということは、標準化に他なりません。クラスを定義する際に、統一されたメソッドを独自に追加することも可能です。したがって、上記の例は次のように実装することもできます:


コードをコピーします コードは次のとおりです:

/**
* PHP ポリモーフィズム
*瓊台ブログ
​*/

// 学生クラスを定義します
クラスの生徒{
// 統一メソッド pub を定義します
パブリック関数 pub(){
echo "学生労働者は授業中です!
";
}
}

// スタッフクラスを定義します
クラスオフィス{
// 統一メソッド pub を定義します
パブリック関数 pub(){
echo "スタッフは仕事中です!
";
}
}

// オブジェクトの種類を決定するメソッド
実行中の関数($obj){
If($obj){
// クラスの統合メソッドを呼び出します
$obj->pub();
}その他{
echo 'そのようなオブジェクトはありません'
; }
}

doing(new students()) // 生徒は授業中です
doing(new office()); // 従業員は働いています

もちろん、上記の例は、この方法でポリモーフィズムが実現できることを意味するものではありません。結局のところ、ポリモーフィズムは複雑なプログラミングで柔軟な再利用を効果的に実現できます。

ポリモーフィズムはプログラミング手法としても理解でき、プログラミングの最終目標は柔軟性、ポリモーフィズム、再利用、効率にほかなりません。

オブジェクト指向ポリモーフィズムとは何ですか?

オブジェクト指向プログラミングの概念は、プログラマーによって追求されてきました。これまでのプログラミングはプロセス指向であり、大規模なプロジェクトには使用できませんでした。これは革命と言えます。 C# では、人間の思考を使用するプログラムの方が適しています。実際、オブジェクトを理解するのは難しくありません。たとえば、あなたは妻を探しています。見た目、彼女は何歳、苗字は何、仕事は何、どんな仕事をしているか、彼氏は何人いるかなど、これらはすべてオブジェクト (妻) が持つ特徴です。
型変換に関しては、これは言うまでもありません。
親クラスオブジェクトからサブクラスオブジェクトへの強制変換については、前提条件は、親クラスオブジェクトがサブクラスオブジェクト、つまりサブクラスオブジェクトの値を持っていることです。が親クラス変数に割り当てられています!
///
親クラス オブジェクトがサブクラス オブジェクトに変換されると、親クラス オブジェクトが呼び出されます。クラスまたはサブクラスのメソッド (または属性) はどうなりますか?

これを説明するのは難しいです。これには、サブクラス内の親クラスのメソッドを非表示にするかオーバーライドするか、親クラスが抽象クラスかどうかなど、多くの問題が含まれます。インターフェースです。待ってください。これには、特定の問題を詳細に分析する必要があります。
分析に役立つように、コードを投稿することをお勧めします。

間違いがある場合は、ご容赦ください。

オブジェクト指向におけるポリモーフィズムの理解

簡単に言うと、ポリモーフィズムとは、OO において、特にオーバーロードされたメソッドや継承されたクラスの形式で、オブジェクトをその型に応じてさまざまな方法で処理できる機能をもつことを意味します。ポリモーフィズムはオブジェクト指向言語の重要な機能であると考えられています。

ポリモーフィズムには多くの分類があります。これらの分類を理解することで、より完全に理解できるようになります。ここではリストしません。

ポリモーフィズムとジェネリック (ジェネリック) を参照してください。 、ジェネリックです。

いわゆるジェネリックとは、特定の型に特化したコーディングを行わず、データ結果であれアルゴリズムであれ、さまざまな型に対してユニバーサルコーディングを使用することを意味します。

従来のジェネリックスは、テンプレート関数と同様の方法でパラメータを一般化することを指します。典型的なアプリケーションは、リスト、ベクトル、アルゴリズムなどの C++ STL です。

そして、OO はすでにインターフェース (Interface) と抽象クラス (Abstract Class) を通じて、本当の意味でのジェネリックスを実装することができます。私の意見では、これが OO の最も素晴らしい点、つまりポリモーフィズムの力です。伝統的な意味でのジェネリックについては、その役割はもはや以前のようなものではないと常々感じています。

ポリモーフィズムと継承 (継承)

厳密に言えば、ポリモーフィズム、継承、オーバーロードは分離されておらず、それらの間には密接な関係があり、ポリモーフィズムはこれら 2 つに基づいています (実際、継承にはオーバーロードの機能があります)。

伝統的なポリモーフィズムは、実際には仮想関数 (Virtual Function) と仮想テーブル (Virtual Table) によって実装されます (初期の C で OO 機能をシミュレートするために最も使用され、C++ の実装も同様です。後の技術は研究されていません) VT を使用するかどうかは不明ですが、当然ながら継承とは切り離せません。つまり、ポリモーフィズムは実際には継承をカバーします。

継承とポリモーフィズムは密接な関係にあるからこそ、見栄を張りがちですが、どうやって区別するのでしょうか?

よく使用される例を見てみましょう:

Abstract Class Sharpimplement IHaveSide {
public bool isSharp(){
return true;
}
public abstract int getSides();
}

Class Triangle extends Sharp {
public override int getSides() {
return 3;
}
}

Class Rectangle extends Sharp {
public override int getSides() {
return 4;
}
}

この種のクラス関係は継承と呼ばれ、これは継承によってもたらされます:
Triangel tri = new Triangle();
println("Triangle is a type of Sharp? " + tri.isSharp()); そして、このメソッドは多態性です。
シャープ Sharp = new Rectangle();
println("私のシャープには " + Sharp.getSides() + " 側面があります。");

2 つの違いは何ですか?明らかに、継承はサブクラスが親クラスを使用するための方法であり、ポリモーフィズムは親クラスがサブクラスを使用するための方法です。

技術的な違いはバインディング期間であり、遅延バインディングはポリモーフィックである必要があります。 ...本文の続き>>




http://www.bkjia.com/PHPjc/866666.html

www.bkjia.com

http://www.bkjia.com/PHPjc/866666.html技術記事 PHP におけるオブジェクト指向のポリモーフィズムを例で説明します。 オブジェクト指向のポリモーフィズムとは何ですか? ポリモーフィズムは、データベースの抽象化と継承に続くオブジェクト指向言語の 3 番目の機能です。ポリモーフィズムはたくさんあります...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。