首頁  >  文章  >  從擴展另一個類別的類別中取得方法

從擴展另一個類別的類別中取得方法

王林
王林轉載
2024-02-09 08:40:30552瀏覽

在PHP中,我們經常遇到需要在一個類別中使用另一個類別的方法的情況。這時,我們可以透過繼承或實例化另一個類別來取得其方法。繼承是指一個類別從另一個類別繼承屬性和方法,透過extends關鍵字實現。實例化則是指建立一個類別的實例對象,並透過該對象來呼叫另一個類別的方法。無論是繼承還是實例化,都可以讓我們在一個類別中輕鬆取得另一個類別的方法,提高程式碼的複用性和靈活性。

問題內容

我有一個類別擴充了另一個類別。根據使用者的輸入,如果輸入“a”,則該類別需要是子類別a,但如果輸入“b”,則該類別將是子類別b。我有一個變數需要成為主類別。我無法存取子類別的方法,因為我定義的變數來自主類別。我怎樣才能讓它發揮作用?

這是一個分解的範例。 myclass 變數在其他地方使用,因此我需要它在任何地方都可以作為子類別使用。

public class Programm
{
   private static MainClass myClass;

   public static void main(String args[]) 
   {
      if (input == 'A') {
         myClass = new SubClassA();
         myClass.subClassAMethod(); // Can't do this becuse subClassAMethod isn't in MainClass
      } else {
         myClass = new SubClassB();
         myClass.subClassBMethod(); // Can't do this becuse subClassBMethod isn't in MainClass
      }
   }
}

我知道我可以將 subclassamethod 和 subclassbmethod 放在主類別中,但如果它不是子類別的一部分,我不希望能夠呼叫這些方法。

有沒有辦法讓 myclass 宣告為同時接受 subclassa 和 subclassb?

解決方法

這表示:變數myclass 存在,並且被限制為指向null,或指向類別的實例,使得該類別是mainclass 或其某些子類型。

java 的設定方式是,java 將直接拒絕編譯與此變數的任何交互,除非它在所有可能的場景中都有意義。 p>

換句話說,即使可以毫無疑問地證明在程式碼流程中的某個時刻,該變數必須指向mysubclassb 的實例,編譯器也不會關心那個。

您的程式碼風格值得懷疑。這不是你的java方式。

請注意,myclass 作為變數名稱只是尖叫「我不明白這是如何工作的」。這是非常誤導的:變數只能引用實例,而不能引用類別。

作為旁注,static 在您的程式碼片段中被濫用。靜態對於大多數java專案來說通常不是必需的,也是一個比較高階的概念。如果您不想了解其具體含義,也沒關係。但你一定不能使用它。 main 目前必須是靜態的(很快從 jdk22 開始就不必是靜態的),所以解決方案是立即擺脫 static

這是一個如何做到這一點的範例。這些程式碼片段對類型和變數使用了更好的名稱,試圖讓事情變得更清晰:

class animal {}
class cat extends animal {
  void meow() {}
}
class dog extends animal {
  void howl() {}
}

class main {
  public static void main(string[] args) {
    new main().go();
  }

  void go() {
    example1('a');
  }

  private animal animal;

  void example1(char input) {
    if (input == 'a') {
      var cat = new cat();
      animal = cat;
      cat.meow();
    } else {
      var dog = new dog();
      animal = dog;
      dog.howl();
    }
  }
}

如果程式碼 new subclassa() 和程式碼 myobject.subclassamethod() 不靠近,那麼這將不起作用。您必須使用 instanceof 來檢查 myclass (同樣,非常糟糕的名稱)是否是正確的類型。看起來像:

// as part of Main.java snippet as above:
public void tryToHowl() {
  if (animal instanceof Dog dog) dog.howl();
}

這會檢查 animal 是否指向 dog 實例或 dog 類型的某個子類型的物件。如果不是,則 if 不會按照您的預期執行任何操作(animal 不是 dog 的實例,因此 if 不會執行其內容)。如果是,則建立一個新變數 dog dog 指向它,輸入 dog,這樣您就可以在其上呼叫僅狗的方法。

請注意,通常使用 instanceof 表示您的程式碼設定錯誤。擁有變數animal animal 的全部意義在於它可以包含任何動物 - 如果您的程式碼實際上需要它是一隻狗,那麼它應該是dog dog。或者,您應該有一個該程式碼的子類,一個專門針對 dogs 的版本,其中有一個定義為 dog dog 的欄位。如果它是一個對多種物件的細節進行編碼的方法(if(貓貓的動物實例)docatthing(); else if(狗狗的動物實例)dodogthing();等的大列表),那麼應該實際上是animal 類別中的一個抽象方法,animal 的每個實作都提供一個實作:帶有class dog 的檔案將包含特定於狗的代碼,因為那是特定於狗的代碼所在的位置。

無論哪種方式,你都不需要instanceof,因此,如果你確實使用instanceof,特別是如果初學者正在這樣做,那麼95% 的程式碼風格明智的非常糟糕的方式做吧。 「壞」的意思是:難以理解、不靈活(所有非學術專案總是要經歷的程式碼需求的未來變化,需要比您想像的更多的努力)、難以整合到現有庫中、通常不類java,即- 不是地球上大多數java 程式設計師的做法,因此不必要地使該程式碼的學習和理解曲線複雜化。

以上是從擴展另一個類別的類別中取得方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除