In PHP stoßen wir häufig auf Situationen, in denen wir eine Methode einer anderen Klasse in einer Klasse verwenden müssen. Zu diesem Zeitpunkt können wir seine Methoden erhalten, indem wir eine andere Klasse erben oder instanziieren. Vererbung bedeutet, dass eine Klasse Eigenschaften und Methoden von einer anderen Klasse erbt, was durch das Schlüsselwort „extends“ erreicht wird. Unter Instanziierung versteht man das Erstellen eines Instanzobjekts einer Klasse und das Aufrufen von Methoden einer anderen Klasse über das Objekt. Unabhängig davon, ob es sich um Vererbung oder Instanziierung handelt, können wir die Methoden einer anderen Klasse problemlos in einer Klasse abrufen und so die Wiederverwendbarkeit und Flexibilität des Codes verbessern.
Ich habe einen Kurs, der einen anderen Kurs erweitert. Basierend auf der Eingabe des Benutzers muss die Klasse bei Eingabe von „a“ die Unterklasse a sein, bei Eingabe von „b“ jedoch die Unterklasse b. Ich habe eine Variable, die in die Hauptklasse umgewandelt werden muss. Ich kann nicht auf die Methoden der Unterklasse zugreifen, da die von mir definierten Variablen aus der Hauptklasse stammen. Wie kann ich dafür sorgen, dass es funktioniert?
Hier ist ein Beispiel für die Zersetzung. Die Variable myclass wird an anderer Stelle verwendet, daher muss sie überall als Unterklasse verfügbar sein.
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 } } }
Ich weiß, dass ich subclassamethod und subclassbmethod in die Hauptklasse einfügen kann, aber ich möchte diese Methoden nicht aufrufen können, wenn sie nicht Teil der Unterklasse sind.
Gibt es eine Möglichkeit, myclass so zu deklarieren, dass es sowohl Subclassa als auch Subclassb akzeptiert?
Das bedeutet: Variable myclass
存在,并且被限制为指向 null
,或者指向类的实例,使得该类是 mainclass
oder ein Untertyp davon.
Java eingerichtet ist, weigert sich Java einfach, jegliche Interaktion mit dieser Variablen zu kompilieren, es sei denn, dies ist in allen möglichen Szenarien sinnvoll. p> Mit anderen Worten, selbst wenn
Sie zweifelsfrei nachweisen könnten, dass diese Variable irgendwann im Fluss Ihres Codes auf eine Instanz von verweisen muss, wäre dem Compiler das egal. mysubclassb
Beachten Sie, dass
als Variablenname nur „Ich verstehe nicht, wie das funktioniert“ schreit. Das ist sehr irreführend: Variablen können nur auf Instanzen verweisen, nicht auf Klassen. 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()
und der Code myobject.subclassamethod()
nicht nahe beieinander liegen, funktioniert dies nicht. Sie müssen instanceof
verwenden, um zu überprüfen, ob (wieder ein sehr schlechter Name) der richtige Typ ist. Sieht aus wie: new subclassa()
和代码 myobject.subclassamethod()
不靠近,那么这将不起作用。您必须使用 instanceof
来检查 myclass
// as part of Main.java snippet as above: public void tryToHowl() { if (animal instanceof Dog dog) dog.howl(); }
, sodass Sie darauf Nur-Hunde-Methoden aufrufen können. animal
是否指向 dog
实例或 dog
类型的某个子类型的对象。如果不是,则 if 不会按照您的预期执行任何操作(animal 不是 dog 的实例,因此 if 不会执行其内容)。如果是,则创建一个新变量 dog dog
指向它,输入 dog
normalerweise die Verwendung von instanceof
bedeutet, dass Ihr Code falsch eingerichtet ist. Der Sinn der Variablen animal animal
besteht darin, dass sie jedes Tierinstanceof
意味着您的代码设置错误。拥有变量 animal animal
的全部意义在于它可以包含任何动物 - 如果您的代码实际上需要它是一只狗,那么它应该是 dog dog
。或者,您应该有一个该代码的子类,一个专门针对 dogs 的版本,其中有一个定义为 dog dog
的字段。如果它是一个对多种对象的细节进行编码的方法(if(猫猫的动物实例)docatthing(); else if(狗狗的动物实例)dodogthing();
等的大列表),那么应该实际上是 animal
类中的一个抽象方法,animal
的每个实现都提供一个实现:带有 class dog
enthalten kann – wenn Ihr Code tatsächlich einen Hund benötigt, dann sollte es Hund Hund
sein . Alternativ sollten Sie eine Unterklasse dieses Codes haben, eine Version speziell für Hunde, deren Feld als Hund Hund
definiert ist. Wenn es sich um eine Methode handelt, die die Details mehrerer Objekte codiert (if (animal Instanz von Katze) docatthing(); sonst wenn (Tierinstanz von Hund) dodogthing();
usw. Liste), dann ist es sollte eigentlich eine abstrakte Methode in der Klasse animal
sein, wobei jede Implementierung von animal
eine Implementierung bereitstellt: mit class dog
> wird den Hund enthalten spezifischer Code, weil dort der hundespezifische Code lebt.
So oder so brauchen Sie instanceof
nicht. Wenn Sie also instanceof
instanceof
,因此,如果你确实使用 instanceof
verwenden
Das obige ist der detaillierte Inhalt vonHolen Sie sich eine Methode aus einer Klasse, die eine andere Klasse erweitert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!