Ich habe eine Elternklasse, A, und eine Kindklasse, B und B überschreibt eine Methode, f, von A.
%Vor%Ich erstelle ein Objekt vom Typ B, b, und werfe dieses auf A und weise es einer Variablen vom Typ A, a zu und rufe dann die Methode f auf a auf. Nun würde ich erwarten, dass die Methode der Elternklasse aufgerufen wird, da ich mit einem Objekt vom Typ A arbeite, aber nicht, es ruft die b-Version der Methode auf (druckt "B" statt "A" in) der Code unten).
Warum ist es so? Ist es eine Designentscheidung oder eine Grenze der Technologie?
Und es soll so funktionieren.
Jede Methode wird dynamisch (dynamisch) entsprechend dem tatsächlichen Typ des Objekts anstelle des Typs, auf den verwiesen wird, ausgelöst (ausgewählt / aufgerufen).
Wenn Sie das Objekt in einen anderen Typ umwandeln, verweisen Sie es einfach mit einem anderen Typ. Der tatsächliche Typ des Objekts wird nicht geändert. (Und es kann sich nie ändern).
Das Verhalten, das Sie beobachten, ist also wie erwartet und so gestaltet. Es ist definitiv keine Einschränkung.
Hoffe, das hilft.
Es ist eine Designentscheidung. Sie haben ein Objekt vom Typ "B" erstellt, also ist es das, was es ist.
Wenn Sie es in A umwandeln, sagen Sie dem Interpreter nur, dass die Methoden, die in einer Klasse des Typs A erwartet werden, für B verfügbar sind, aber da Sie eine @Override-Methode für B haben, wird sie verwendet es.
Wenn Sie die Instanz umwandeln, implizieren Sie einfach, dass es sich um eine Instanz der Superklasse handeln könnte, ABER die interne Implementierung dieser Instanz wird sich nicht ändern, deshalb erhalten Sie dieses Ergebnis!
Metaphorisch gesprochen, wenn Sie eine amerikanische Personenklappe auf eine britische Person (Besetzung) angewendet haben, wäre diese Person immer noch englisch (Vererbung), aber wenn Sie diese Person gebeten hätten zu sprechen (eine Methode aufzurufen), würden Sie immer noch die Briten hören Akzent, nicht der amerikanische (am Ende kommt es auf die interne Umsetzung an): -)
So soll es funktionieren. Es ruft die Methode auf B
auf, weil die Variable so instanziiert wurde. Der Typ der Variablen, der es zugewiesen wurde, ändert nicht die Tatsache, dass a
vom Typ B
ist. Die meisten Sprachen sind wie folgt, einschließlich C #.
Tags und Links java inheritance