Selbsttypvererbung in scala

9

Sagen Sie, ich habe die folgenden Merkmale:

%Vor%

Compilerfehler: illegal inheritance; self-type C does not conform to B's selftype B with A
Wie erwartet, wenn ich die Annotation des Selbsttyps auskommentiere, ist der Compiler glücklich.

Ich denke, es ist ziemlich offensichtlich, warum C auch diesen Selbsttyp braucht. Was ich nicht verstehe, warum es nicht von A "erben" kann, wenn der Compiler bereits herausfinden könnte, dass es benötigt wird?

Ich denke, es könnte die Ausführlichkeit reduzieren, wenn Sie Selbsttypen mit komplizierten Hierarchien verwenden, besonders wenn Sie eine große Menge von Eigenschaften mischen, von denen jeder seinen eigenen Selbsttyp hat.

Ich denke, wahrscheinlich gibt es einen guten Grund für das aktuelle Verhalten, ich konnte einfach nicht herausfinden, was es ist.

Zuerst dachte ich, es könnte etwas mit der Linearisierung zu tun haben, aber es scheint mir, dass es hier nicht funktioniert (selbst wenn ich mehr Charakterzüge mit komplizierteren Selbsttypen gemischt hätte).

Würde es in einigen Fällen zu Unklarheiten führen? Wenn ja, warum kann es nicht funktionieren, wenn es keine Mehrdeutigkeit gibt?

Oder hängt es mit einigen Schwierigkeiten bei der richtigen Umsetzung zusammen?

Ich könnte einige Diskussionen über das Thema finden (wie Selbst-Typ wird nicht vererbt ), aber sie geben meistens nur das Problem an und schlussfolgern, dass es so ist, ohne zu viel Erklärung und / oder eine Lösung (falls es existiert).

    
Sandor Murakozi 06.08.2010, 07:16
quelle

1 Antwort

1
%Vor%

ist nicht die einzige Lösung. Du könntest auch

haben %Vor%

Das heißt, alles, was die Schnittstelle von A erbt, wird akzeptiert. Wenn Sie sich auf eine konkrete Implementierung verlassen müssen, würden Sie ein Mixin wählen; Wenn die Implementierung dem Benutzer überlassen ist oder Sie einen guten Grund haben, das Merkmal nicht im Merkmal zu spezifizieren (zum Beispiel, um Abhängigkeitsprobleme zu lösen), würden Sie es zu einem Selbst-Typ machen.

    
Debilski 06.08.2010 11:20
quelle