Swift Protocol Inheritance & Generic-Funktionen

8

Betrachten Sie den folgenden Spielplatz:

%Vor%

Aus den Ergebnissen scheint der Compiler die richtigen Typen abgeleitet zu haben, konnte aber nicht die korrekten Initialisierer aufrufen. Wie kommt es, dass ich StringInitable explizit in der B-Klasse implementieren muss (Test durch Entfernen des Kommentars in der B-Klassendefinition), damit die generische Funktion "Maker" den richtigen Initialisierer aufruft?

    
Måns Severin 06.10.2014, 16:26
quelle

1 Antwort

2

Das riecht wie ein Compilerfehler aus einem einfachen Grund: makerB ist eine Variable von B type, aber es wird eine Instanz von A zugewiesen. Dies sollte nicht möglich sein, und tatsächlich, wenn Sie versuchen, zu drucken, und allgemein Zugriff auf die another_stored -Eigenschaft der makerB -Variable, eine Laufzeitausnahme ausgelöst wird, und ich würde nichts anderes erwarten.

Das liegt daran, dass, wenn B eine Unterklasse von A ist, eine Instanz von A keiner Variablen von B type zugewiesen werden kann (während das Gegenteil möglich ist).

Die Zuweisung einer Variablen vom Typ A zu einer Variablen vom Typ B ist jedoch möglich, jedoch nur unter folgenden Bedingungen:

  • ein expliziter Downcast von A nach B ist erfolgt (der Compiler sollte sonst einen Fehler haben)
  • Die Instanz, auf die von der A -Variable verwiesen wird, ist tatsächlich eine Instanz von B (eine Laufzeitausnahme sollte sonst ausgelöst werden)

Beachten Sie, dass der Compiler nicht nur den richtigen Initialisierer aufgerufen hat - er hat den Initialisierer einer anderen Klasse aufgerufen

    
Antonio 06.10.2014, 19:21
quelle