Dies ist, was ich denke, Sie sagen:
public class A {
}
public class B extends A {
}
später im Code:
A apple = new A();
B banana = new B();
Hier sind einige Optionen, die Sie nützlich finden können: In Bezug auf
if (apple.getClass() == A.class) { // Found an A }
if (banana.getClass() == A.class) { // This is not an A, won't get here. }
if (apple instanceof A) { // This is definitely an A }
if ((apple instanceof A) && (!(apple instanceof B))) { // It's an A but not a B }
die letzte Option, schreiben Sie folgendes:
Klar, kann ich so etwas wie „Objekt instaceof A & &! (Objekt Instanz B)“ schreiben, aber das ist ein sehr schlechtes Design, da ich jedes Mal den Code ändern müssen werde ich neue hinzufügen Unterklassen zu A. Bessere Alternativen?
Polymorphie hilft uns fast immer hier. Ihr Punkt, den Code jedes Mal zu ändern, wenn Sie eine Unterklasse hinzufügen, ist genau die Art von Symptomen, die Sie als standardmäßige objektorientierte Designentwicklung erkennen sollten. Denken Sie über das Verhalten nach, das Sie erzeugen möchten. Kannst du das in die Klasse selbst schieben, anstatt sie an einen externen Anbieter zu delegieren, der herausfinden muss, an welcher Klasse er gerade arbeitet?
Ohne weitere Informationen, kann ich nicht zu viel gebend, aber hier ist ein ziemlich einfaches Beispiel:
// Instead of this
if (apple.isClassA()) { // run class A code
} else if (apple.isClassB()) { // run class B code
// And so forth
}
das Design ändern eher wie dieses werden:
public class A {
public void executeCommand() {
// run class A code
// This method knows that it's definitely an A, not a B
}
}
public class B extends A {
public void executeCommand() {
// run class B code
// This method knows that it's a B (and, therefore, an A as well).
}
}
Wo später in der Ausführungscode, ersetzen Sie Ihren vorherigen if-Test durch:
apple.executeCommand();
banana.executeCommand();
Ad Kurz gesagt, dies ist eine fast triviale objektorientierte Design-Überprüfung, aber es kann etwas locker und helfen Sie mit Ihrem Problem Subclassing.
+1 mit Ihrer Antwort. Java ist eine statische Sprache, wenn Sie den dynamischen Typ Ihrer Objekte berücksichtigen müssen, sehen Sie sich das Besuchermuster an. – pgras
das sieht aus wie Fall des Dispatcher-Muster in sehr OO-Art gelöst werden. Das Muster ermöglicht unterschiedliche Verhaltensweisen abhängig vom Objekttyp, aber ich bin mir nicht sicher, ob dies in Java möglich ist. IMHO Sprachen brauchen bessere Unterstützung für Meta-Programmierung ... –