Frage

Zunächst einmal, ich weiß so gut wie nichts über die Sprache der Theorie, und ich weiß kaum noch andere Sprachen außer Java, aber ich hatte eine Idee, die ich denke, wäre cool, aber ich brauche ihr, mir zu sagen:
a: warum es saugt
b: Wie Sprache x hat, dass seit Jahren
c: wie mein Verstand saugt
d: alle oben

Die Idee würde Zusammensetzung die gleiche einfache Wiederverwendung von Code, die extends tut.

Also, wenn Sie hatte eine Klasse wie folgt:

public interface A {  
    public void methodInA();  
}

Und dann hatte man eine Klasse wie folgt:

public class B {  
    private composed A;
    public B() {
        // construct A within constructor
    }
}

Sie würden dann in der Lage sein, dies zu tun:

B myB = new B();
myB.methodInA();

Ohne in der Delegation in B-Klasse hinzufügen zu müssen. Aber man könnte auch das gleiche tun wie mit Vererbung, dh:

@Overrides
public void methodInA(){
    // B's own delegation method
}

Nachteile:

  • Methoden werden im Quellcode versteckt, ist es weniger offensichtlich zu machen, woher der Anruf kommt, aber das ist auch der Fall mit extends
  • , wenn zusammengesetzt Felder die gleiche Methode Unterschrift dort teilen muss ein Konflikt gelöst werden (wie in Konflikt stehende Schnittstellen können dies lösen?)
  • , wenn Sie mehr zusammengesetzt Felder des gleichen Typs haben wollen, gäbe es einen offensichtlichen Konflikt, für den Bereich zu delegieren
  • wahrscheinlich 100 andere Dinge, die ich habe nicht gedacht

Wie ich schon sagte, ich bin natürlich kein Sprachwissenschaftler, und ich habe nicht habe Alter darüber nachgedacht, die Idee, nur tauchte in meinem Kopf und ich wollte wissen, wie falsch ich bin. Ich denke, es wäre irgendwie cool sein.

War es hilfreich?

Lösung

Ich denke, wenn man es beschränkt, so dass eine Klasse diese Funktion nur eine einzige Klasse zu komponieren verwenden könnte, wäre es etwas nützlich sein und würde eine Menge Kopfschmerzen vermeiden, die diskutiert werden.

Ich persönlich hasse Vererbung von konkreten Klassen. Ich bin ein großer Befürworter von Artikel 14 von Blochs Effective Java , Favor Zusammensetzung über inheritence . Ich denke, dass so etwas wie dies würde es ein wenig einfacher macht das Idiom zu implementieren er in diesem Punkt empfiehlt.

Ehrlich gesagt, wenn Sie wirklich wissen, was Sie taten, ich wette, Sie einen Compiler Anmerkung schreiben könnte, die damit umgehen würde. Also vorausgesetzt, Sie eine Klasse Bar hatte, die die Schnittstelle implementiert IBar, Ihre Klasse würde wie folgt aussehen:

public class Foo {

  @Delegate(IBar.class)
  private Bar bar;

  // initialize bar via constructor or setter
}

Dann während der Kompilierung könnte Foo gemacht werden IBar zu implementieren und eine der Methoden, die auf dieser Schnittstelle, die nicht bereits von Foo umgesetzt wurden würde erzeugt am Ende wird wie folgt aussehen:

public Baz method1(Qux val) {
  return bar.method1(val);
}

Wie bereits erwähnt Sie die Einschränkung machen wollen würde, dass nur ein Feld pro Klasse diese Anmerkung nutzen könnten. Wenn mehrere Felder diese Anmerkung hatte würden Sie wahrscheinlich einen Kompilierungsfehler werfen wollen. Alternativ könnte man einen Weg finden, um irgendeine Art von Vorrang Modell in die Parameter an sie übergeben zu kodieren.

Nun, da ich diesen heraus geschrieben habe, die irgendwie cool zu sein scheint. Vielleicht werde ich mit ihm nächste Woche spielen, um. Ich werde diese aktualisieren, wenn ich es schaffe etwas herauszufinden.

Andere Tipps

Es klingt cool, aber ich denke, es ist für einige schreckliche Sprachkonstrukte macht. Offensichtlich gibt es ein Problem, wenn Sie mehr als eine ‚Zusammensetzung‘ der gleichen Klasse erklären, aber auch wenn Sie das, was über den Fall verbieten, wenn ein Anruf entspricht einem Verfahren, das in mehr als einer der (anderen) zusammengesetzt Klassen? Sie müßten angeben, welche man in der Hauptklasse genannt, und Sie würden für die zusätzliche Syntax benötigen. Die Situation wird noch schlimmer, wenn es öffentliche Mitglieder in den Klassen.

Zusammensetzung wird verwendet, um Probleme mit Mehrfachvererbung zu verhindern. Zulassen Zusammensetzung wie dieser ist die Mehrfachvererbung, zumindest in Bezug auf die Lösung, welche Methode aufzurufen effektiv ermöglicht. Da eine wichtige Design-Entscheidung mit Java Mehrfachvererbung nicht zulassen sollte (aus guten Gründen) Ich denke, es ist unwahrscheinlich, dass dies jemals zu Java eingeführt werden würde.

Ich bin nicht sicher, dass ich einen klaren Vorteil zu tun dies aber zu sehen. Ich verstehe den Punkt, den Sie machen. Im Moment eine Methode auf A rufen Sie myB.getAInstance haben (). MethodInA (), aber Sie wollen, dass myB.methodInA machen ().

Aber, was passiert, wenn Sie mehrere Instanzen von A haben? Wie würde der Aufruf der Methode gelöst? Viele Male Zusammensetzung bedeutet eine Eins-zu-viele Assoziations so viele B A Instanzen hat. Was passiert dann?

Ich stimme mit Ihren Nachteile aufgeführt. Es kann einfach zu viel Verwirrung führen, als es wert ist.

Überprüfen Sie heraus, was in einigen Sprachen "Mixins" genannt wird, und "Rollen" in der Perl 5 Moose OO-System.

Es gibt auch den Unterschied zwischen Zusammensetzung und Aggregation zu betrachten. Wie weiß der Compiler, ob du meinst 'is-a' oder 'hat-ein' Beziehungen?

  • Ist das ganze Objekt Diagramm für die Garbage Collection geeignet werden oder nur die Spitze des Graphen?

Ein paar der ORM-Mapping-Tools und Frameworks über / um sie für belongsTo oder has-many Beziehungen zwischen persistenten Objekten bieten und auch für die Kaskadierung einige bieten löschen (Zusammensetzung). Ich weiß nicht, von einem aus der Hand, die den einfachen syntaktischen Zucker liefert, die Sie suchen.

Eigentlich auf dem zweiten Gedanken, Groovy MetaClass und metaprogramming Idiom (n) kann etwas sehr ähnlich, mit 'Auto-Magie' Delegation liefern.

Mehrfachvererbung ist in C ++ erlaubt, das weiß ich anders, aber es ist auf dem gleichen Denkprozess. Java wurde entwickelt, um keine Mehrfachvererbung zu ermöglichen, so dass es weniger Verwirrung wäre daher Bugs und Exploits.

Was haben Sie ist mit den Prinzipien der Java in direktem Konflikt vorgeschlagen.

Having said that, es wäre cool (nicht unbedingt nützlich) sein. Ich bin ein Java-Programmierer, die von C ++ umgeschaltet. Ich mag in der Lage, meine eigenen Fehler zu machen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top