Heim  >  Artikel  >  Holen Sie sich eine Methode aus einer Klasse, die eine andere Klasse erweitert

Holen Sie sich eine Methode aus einer Klasse, die eine andere Klasse erweitert

王林
王林nach vorne
2024-02-09 08:40:30552Durchsuche

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.

Frageninhalt

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?

Workaround

Das bedeutet: Variable myclass 存在,并且被限制为指向 null,或者指向类的实例,使得该类是 mainclass oder ein Untertyp davon.

So wie

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

Ihr Codierungsstil ist fraglich. Das ist nicht Ihr Java-Weg.

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

Als Randbemerkung,

. static 在您的代码片段中被滥用。静态对于大多数java项目来说通常不是必需的,也是一个比较高级的概念。如果您不想了解其具体含义,也没关系。但你一定不能使用它。 main 目前必须是静态的(很快从 jdk22+ 开始就不必是静态的),所以解决方案是立即摆脱 static

Hier ist ein Beispiel dafür. Diese Codeausschnitte versuchen, die Dinge klarer zu machen, indem sie bessere Namen für Typen und Variablen verwenden:

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();
    }
  }
}

Wenn der Code 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();
}

Dies prüft

, sodass Sie darauf Nur-Hunde-Methoden aufrufen können. animal 是否指向 dog 实例或 dog 类型的某个子类型的对象。如果不是,则 if 不会按照您的预期执行任何操作(animal 不是 dog 的实例,因此 if 不会执行其内容)。如果是,则创建一个新变量 dog dog 指向它,输入 dog

Bitte beachten Sie, dass

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,因此,如果你确实使用 instanceofverwenden

, insbesondere wenn Anfänger es tun, dann ist der Codestil zu über 95 % sehr schlecht Art und Weise, es zu tun. „Schlecht“ bedeutet: schwer verständlich, unflexibel (zukünftige Änderungen der Codeanforderungen, die alle nicht-akademischen Projekte immer durchlaufen, erfordern mehr Aufwand als Sie denken), schwierig in bestehende Bibliotheken zu integrieren, also oft nicht klassenspezifisches Java - ist nicht das, was die meisten Java-Programmierer auf dem Planeten tun, was den Lern- und Verständnisprozess dieses Codes unnötig verkompliziert. 🎜

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen