Donnerstag, Dezember 12, 2019

Erstellen Sie eine Instanz innerhalb Abstrakte Klasse mit der Spiegelung

Ist es möglich, erstellen Sie eine Instanz von einer abgeleiteten Klasse in der abstrakten Vorfahren-Klasse mit der spiegelung
Sagen wir:

abstract class Base {

public Base createInstance(){
  //using reflection
    Class<?> c = this.getClass();
    Constructor<?> ctor = c.getConstructor();
    return ((Base) ctor.newInstance());
}

}//end Base

class Derived extends Base {

 main(){

new Derived().createInstance()

 }

}

  • Hast du es versuchen? Scheint, wie es funktionieren würde.
  • Nein, es ist nicht möglich
  • Was passiert, wenn du versucht? Sie können dies tun, aber das ist eine ziemlich verdächtige design-Wahl.
  • Könnte es gerechtfertigt sein, wie eine copy-Methode.
  • Beachten Sie, dass Sie verschwenden Zeilen code: public Base createInstance() { return (Base) getClass().newInstance(); } ist alles, was Sie brauchen (Modul Ausnahmen).
  • Umm. Dass code nicht selbst kompilieren, auf den ersten Platz. Egal, was passiert, wenn du es ausprobiert?>

3 Kommentare

  1. 3

    Können Sie dies tun,

    public class Derived extends Base {
        public static void main(String ... args) {
            System.out.println(new Derived().createInstance());
        }
    }
    
    abstract class Base {
        public Base createInstance() {
            //using reflection
            try {
                return getClass().asSubclass(Base.class).newInstance();
            } catch (Exception e) {
                throw new AssertionError(e);
            }
        }
    }

    Drucke

    [email protected]

    Ein häufiger Muster ist zu verwenden, Cloneable

    public class Derived extends Base {
        public static void main(String ... args) throws CloneNotSupportedException {
            System.out.println(new Derived().clone());
        }
    }
    
    abstract class Base implements Cloneable {
        @Override
        public Object clone() throws CloneNotSupportedException {
            return super.clone();
        }
    }

    Drucke

    [email protected]

    Jedoch, die Notwendigkeit, die entweder vermieden werden sollte. In der Regel gibt es einen anderen Weg das zu tun, was Sie benötigen, so dass base nicht implizit davon abhängen, abgeleitet.

  2. 2

    Nachweisen, dass es funktioniert, ist einfach:

    abstract class Base {
      public Base createInstance() throws Exception {
        return getClass().newInstance();
      }
    }
    
    public class Derived extends Base {
      public static void main(String[] args) throws Exception {
        System.out.println(new Derived().createInstance().getClass());
      }
    }

    Drucke

    class test.Derived

    Sollten Sie sich Fragen, zweimal, warum Sie es brauchen und ob es wirklich ein guter Ansatz für dein problem. Wenn Sie brauchen, Klonen, sollten die clone Mechanismus, der tut im Grunde das gleiche.

    • Ich bin versucht, zu schreiben, eine API(cover Base abstrakte Klasse). Und ich brauche deepCopy-Methode, die für diese Basisklasse.
    • Tief kopieren nicht gelöst werden können, im Allgemeinen jedenfalls. Sie müssen sorgfältig durchdacht, die benutzerdefinierten code für jede Klasse. Das ist, warum Sie gewinnen sehr wenig durch die Verallgemeinerung Instanz erstellen code.
  3. 1

    Können Sie Class.forName() und Class.newInstance() zu erstellen, die für jede Klasse. Aber es gibt keinen Weg, um leicht zu identifizieren Unterklassen einer Klasse. Sehen das JavaWorld-Tipp für eine Technik, dies zu tun.

    Allerdings denke ich , die wirkliche Frage ist, was ist es Sie letztlich versuchen, zu erreichen, und es kann getan werden leicht unter Verwendung konventioneller Techniken.

Kostenlose Online-Tests

Letzte Fragen

Tun ItemView löst Blase?

Ich habe eine CompositeView für eine Tabelle. Ich habe Trigger-set in der Kind-ItemView für jede Zeile... var TableRow = Marionette.ItemView.extend({ tagName:...

Wie kann ich untersuchen, WCF was 400 bad request über GET?

Die folgenden WCF-endpoint funktioniert gut mit dem WCF test client: AssetList ListFlaggedAssets(short processCode, string platform, string endpoint = "null", string portalId = "null", int...

Bei der Verwendung von UUIDs, sollte ich auch mit AUTO_INCREMENT?

Wir bauen eine neue web-app, die eine offline-iPad - /Android-app-version auf einer Reihe von lokalen Geräten, die Einsätze mit neuen Daten. Als solche benötigen...

Actionscript-Objekt, das verschiedene Eigenschaften

Wie kann ich die Anzahl der Eigenschaften in einer generischen Actionscript-Objekt? (Wie die Array-Länge) InformationsquelleAutor Fragsworth | 2011-01-15

Wie plot mehrere Graphen und nutzen Sie die Navigations-Taste im [matplotlib]

Die neueste version von matplotlib erstellt automatisch Navigations-buttons unter den graph. Aber die Beispiele, die ich finden alles im Internet zeigen, wie erstellen Sie...