Frage

  

Mögliche Duplizieren:
   Scala traits vs abstrakte Klassen

Was ist der begriffliche Unterschied zwischen abstrakten Klassen und Eigenschaften?

War es hilfreich?

Lösung

Eine Klasse kann nur erweitert eine Super und somit nur eine abstrakte Klasse. Wenn Sie mehrere Klassen der Scala Art und Weise komponieren wollen, ist mixin Klasse Zusammensetzung : Sie kombinieren eine (optional) übergeordnete Klasse, Ihre eigenen Mitgliedsdefinitionen und eine oder mehr Züge . Ein Merkmal im Vergleich zu Klassen in eingeschränkt ist, dass es nicht Konstruktorparameter haben kann (vergleiche das scala Referenzhandbuch ).

Die Einschränkungen von Eigenschaften im Vergleich zu Klassen typische Probleme mit Mehrfachvererbung zu vermeiden eingeführt werden. Es gibt mehr oder weniger komplizierte Regeln in Bezug auf die Vererbungshierarchie; es könnte am besten sein, eine Hierarchie zu vermeiden, wo dies tatsächlich ankommt. ;-) Soweit ich verstehe, kann es nur aus, wenn Sie zwei Methoden mit demselben Signatur / zwei Variablen mit dem gleichen Namen von zwei verschiedenen Merkmalen erben.

Andere Tipps

Ein Aspekt von Merkmalen ist, dass sie ein sind stapelbar . Unter Berücksichtigung einer constrainted Form von AOP (um Beratung).

trait A{
    def a = 1
}

trait X extends A{
    override def a = {
        println("X")
        super.a
    }
}  


trait Y extends A{
    override def a = {
        println("Y")
        super.a
    }
}

scala> val xy = new AnyRef with X with Y
xy: java.lang.Object with X with Y = $anon$1@6e9b6a
scala> xy.a
Y
X
res0: Int = 1

scala> val yx = new AnyRef with Y with X
yx: java.lang.Object with Y with X = $anon$1@188c838
scala> yx.a
X
Y
res1: Int = 1

Die Auflösung von super spiegelt die Linearisierung der Vererbungshierarchie.

Konzeptionell ist eine Eigenschaft, eine Komponente einer Klasse, nicht eine Klasse für sich. Als solches ist es nicht hat in der Regel nicht Konstrukteuren, und ist es nicht „von selbst steht“ gemeint.

Ich schlage vor, eine abstrakte Klasse zu verwenden, wenn es eine eigenständige Bedeutung hat, und Züge, wenn Sie nur wollen, Funktionalität hinzufügen, in einer objektorientierten Weise. Wenn Sie zwischen den beiden nicht sicher sind, , könnten Sie feststellen, dass, wenn alle Methoden drehen sich um eine einzige Sache zu tun, möchten Sie wahrscheinlich ein Merkmal.

Für ein (nicht sprachspezifisch) Beispiel, wenn Ihre Mitarbeiter sollten sowohl „Person“ erweitern und „klonbar“, macht Person eine Basisklasse und klonbar ein Merkmal.

Mindestens in Scala, hat die Züge System eine explizite Art und Weise Mutter Priorität in einer Unterklasse erklärt typische Probleme mit Mehrfachvererbung, das heißen Konflikte mit geerbten Methoden, die die gleiche Signatur zugeordnet zu vermeiden.

Traits sind verwandt mit Java-Schnittstellen, sind aber erlaubt Methode Implementierungen haben.

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