<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## **多態** 多態是指在面向對象中能夠根據使用類的上下文來重新定義或改變類的性質和行為 一個對外接口,多個內部實現方法 多態性的一般定義為:**同一個操作作用于不同的類的實例,將產生不同的執行結果**。即不同類的對象收到相同的消息時,將得到不同的結果。 在實際的應用開發中,采用面向對象中的多態主要在于可以**將不同的子類對象都當作一個父類來處理**,并且可以屏蔽不同子類對象之間所存在的差異,寫出通用的代碼,做出通用的編程,以適應需求的不斷變化 如例子2: 具有表現多種形態的能力特征。在面向對象中表示根據對象的類型以不同方式處理。多態性允許每個對象以適合自身的方式去響應共同的消息。多態性增強了軟件的靈活性和重用性。 >[danger]多態一般用接口做最好 ``` <?php // 多態:多種形態 // 走路 // 坐公交 // 騎自行車 abstract class Style { // 上 abstract public function up(); // 下 abstract public function down(); } // 走路的方式(繼承了Style,就必須實現up和down兩個方法) class Walk extends Style { public function up() { echo '邁左腿走路<br>'; } public function down() { echo '邁右腿走路<br>'; } } // 坐公交的方式 class Bus extends Style { public function up() { echo '上車<br>'; } public function down() { echo '下車<br>'; } } // 自行車 class Bike extends Style { public function up() { echo '左腿蹬車<br>'; } public function down() { echo '右腿等車<br>'; } } ``` 獲取來學校的方式(Style作為類型約束條件,約束必須傳遞的參數是其子類實例化的對象) ``` function getStyle(Style $obj) { /* if ($obj instanceof Walk) { $obj->leftTui(); $obj->rightTui(); } else if ($obj instanceof Bus) { $obj->up(); $obj->down(); } else if ($obj instanceof Bike) { $obj->leftDeng(); $obj->rightDeng(); }*/ $obj->up(); $obj->down(); } $w = new Walk; $b = new Bus; $bike = new Bike; getStyle($w); getStyle($b); getStyle($bike); ``` 獲取來學校的方式(Style作為類型約束條件,約束必須傳遞的參數是其子類實例化的對象) ``` function getStyle(Style $obj) { $obj->up(); $obj->down(); } $w = new Walk; $b = new Bus; $bike = new Bike; getStyle($w); getStyle($b); getStyle($bike); ``` 例子2:多態的應用設計 >[danger]在實際的應用開發中,通常為了使項目能夠在以后的時間里的輕松實現擴展與升級,需要通過繼承實現可復用模塊進行輕松升級。在進行可復用模塊設計時,就需要盡可能的減少使用流程控制語句。此時就可以采用多態實現該類設計。 通常采用流程控制語句實現不同類的處理。其代碼如下所示。 ``` 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()); //顯示員工工作 ``` 分析:在上述程序中,首先定義兩個員工類:油漆工類和打字員類。然后定義一個處理函數,在該函數中,判斷員工是否為已經定義的員工,打印出員工的工作狀態。其結果如下所示。 油漆工正在刷漆 打字員正在打字 從 以上程序可輕松看出,若想顯示其幾種員工的工作狀態,需要首先定義該員工類,并在該員工類中定義員工的工作,然后在printworking()函數中增 加elseif語句以檢查對象是哪一員工類的實例。這在實際的應用中,是非常不可取的。若此時采用多態,則可以輕松解決此問題。 可以首先創建一個員工父類,所有的員工類將繼承自該員工父類,并且繼承父類的所有方法與屬性。然后在員工類中創建“是一”關系,判斷是否為合法的員工。 【示例】例舉了采用多態的方式改寫上例。其代碼如下所示。 */ //代碼如下: ``` 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());//顯示經理的工作 ``` 分析:在上述程序中,首先定義一個員工基類,并定義一個員工工作狀態的方法。然后定義將繼承自員工基類的三個員工類:油漆工類、打字員類和經理類。然后定義顯示員工工作狀態的方法。并在該方法中創建一個“是一”關系,用于判斷是否為合法的員工。其結果如下所示。 油漆工正在刷漆! 打字員正在打字! 經理正在開會! 從上例可發現,無論增加多少個員工類,只需要實現自員工父類繼承的該員工類和方法。而無須修改顯示員工工作狀態的方法printworking()。 還有一只是改變參數數量的重載,同樣是因為PHP也不支持方法的重載,所以也需要些變通的方法實現,如下: ``` // 通過可變參數來達到改變參數數量重載的目的 // 不是必須傳入的參數,必須在函數定義時賦初始值 function open_database($DB, $cache_size_or_values=null, $cache_size=null) { switch (function_num_args()) // 通過function_num_args()函數計算傳入參數的個數,根據個數來判斷接下來的操作 { case 1: $r = select_db($DB); break; case 2: $r = select_db($DB, $cache_size_or_values); break; case 3: $r = select_db($DB, $cache_size_or_values, $cache_size); break; } return is_resource($r); } ``` 例子4: ``` <?php /** * 虛基類 */ abstract class T{ abstract function show(); } /** * 子類 */ class T1 extends T { public function show(){ echo "T1 from abstract class!<br/>"; } public function show1(){ echo "T1 not from abstract class!<br/>"; } } /** * 子類 */ class T2 extends T { public function show(){ echo "T2 from abstract class!<br/>"; } public function show1(){ echo "T2 not from abstract class!<br/>"; } } class T3 { public function show(){ echo "in T3!<br/>"; } public function show1(){ echo "in T3!<br/>"; } } $t1 = new T1(); $t2 = new T2(); $t3 = new T3(); show($t1); show($t2); //報錯,$t3不是T,所以被show函數調用的時候,會報類型不對的錯誤 //show($t3); function show( T $t ){//注意參數的類型 $t->show(); $t->show1(); } ```
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看