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?
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:
A
nach B
ist erfolgt (der Compiler sollte sonst einen Fehler haben) 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
Tags und Links inheritance swift protocols swift-playground