it-swarm.com.de

Gibt instanceof true zurück, wenn eine übergeordnete Instanz vorhanden ist?

Ich habe eine Klasse Child, die Parent erweitert.

Parent child = new Child();

if (child instanceof Parent){
    // Do something
}

Gibt dies wahr oder falsch zurück und warum?

43
ikbal

Ja würde es. Und warum sollte es nicht?

Weil das Kind tatsächlich eine Instanz des Elternteils ist. Wenn Sie eine Operation nur für ein Kind durchführen möchten, sollten Sie dies überprüfen

if (child instanceof Child){
}

Sie sollten sich jedoch an die folgende Aussage von Scott Meyers aus Effective C++ erinnern:

"Immer wenn Sie bemerken, dass Sie Code der Form schreiben", wenn das Objekt vom Typ T1 ist, dann tun Sie etwas, aber wenn es vom Typ T2 ist, dann tun Sie etwas anderes ", schlagen Sie sich.

was meiner meinung nach auch in diesem fall zutrifft. Wenn Sie etwas basierend auf dem Klassentyp tun möchten, zu dem das referenzierte Objekt gehört, sollte Ihnen die folgende Codestruktur dabei helfen.

HINWEIS: Ich habe es nicht kompiliert.

class Parent {
    public void doSomething() {
        System.out.println("I am the Parent, and I do as I like");
    }
}

class ChildA extends Parent {
    public void doSomething() {
        System.out.println("I am a child named A, but I have my own ways, different from Parent");
    }
}

class ChildB extends Parent {
    public void doSomething() {
        System.out.println("I am a child named B, but I have my own ways, different from my Parent and my siblings");
    }
}

public class Polymorphism101 {

    public static void main(String[] args) {

        Parent p = new Parent();
        p.doSomething();

        p = new ChildA();
        p.doSomething();

        p = new ChildB();
        p.doSomething();

    }

}

EDIT: Ein besseres Beispiel

Sie könnten eine Zeichnungsanwendung entwickeln. Eine Anwendung, die Formen jeglicher Art zeichnet. In diesem Fall sollten Sie einen abstrakten Typ Shape haben.

Für Zwecke wie; alle Formen zeichnen; liste alle Formen auf; Um eine Form zu finden oder eine Form zu löschen, benötigen Sie eine Liste von Formen. Da es sich bei der Liste um einen übergeordneten Typ handelt, können beliebige Formen gespeichert werden.

Die Shape Schnittstelle/abstrakte Klasse/virtuelle Klasse sollte eine abstrakte/rein virtuelle Funktion haben Draw() . In Ihrem DrawToDeviceLoop rufen Sie einfach Draw() für jede Form auf. Sie müssen nie überprüfen, welche Form es ist.

Die Schnittstelle Shape kann eine abstrakte Implementierung AbstractShape haben, die den Namen oder die ID der Form als Datenelemente und GetName, Cleanup und andere Funktionen mit gemeinsamer Funktionalität haben kann zu allen Formen.

Denken Sie daran, dass ein abstrakter Typ nicht instanziiert werden kann , daher kann Shape selbst nicht instanziiert werden, da es auch nicht gezeichnet werden kann.

56
Ozair Kafray

instanceof gibt true zurück, wenn es sich um eine Unterklasse handelt ...

Instanz der Dokumentation

5
Yochai Timmer

Ja. instanceof ist wahr, wenn die Referenz (linke Seite des instanceof-Ausdrucks) in ReferenceType umgewandelt werden kann (der Typ auf der rechten Seite des instanceof-Ausdrucks). Dies gilt für Unterklassen in Bezug auf ihre Eltern:

Child child = new Child();
Parent parent = (Parent) child; //works!
assert child instanceof Parent; //true

Von Die Java-Sprachspezifikation, Java SE 9 Edition :

15.20. Beziehungsoperatoren
...
RelationalExpression Instanz von Referenztyp

15.20.2. Typvergleich Operatorinstanzvon
...
Zur Laufzeit ist das Ergebnis des instanceof-Operators true, wenn der Wert von RelationalExpression nicht null ist und der Verweis in ReferenceType umgewandelt werden kann, ohne eine ClassCastException zu erzeugen. Ansonsten ist das Ergebnis false

0
Roland

natürlich gibt es true zurück, da child eine Instanz des übergeordneten Elements ist

0
yahh