在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中文網其他相關文章!