Entwickler-Ecke
C# - Die Sprache - fehlverhalten bei cast nach einer Abstrakten Klasse?
Teekeks - Mo 28.11.11 16:08
Titel: fehlverhalten bei cast nach einer Abstrakten Klasse?
Hallo!
ich fuchse mich gerade etwas weiter in C# ein und da ist mir eben was Aufgefallen.
Folgendes Szenario:
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| abstract class MyBase { abstract public bool DoSometing(); }
class AwesomeClass : MyBase { public AwesomeClass() { System.Console.Out.WriteLine("A Awesome Class was created"); }
public override bool DoSometing() { System.Console.Out.WriteLine("AwesomeClass.DoSometing"); return true; } } |
So.
Jetzt verstehe ich aber nicht warum folgendes so Funktioniert:
C#-Quelltext
1: 2:
| MyBase a = new AwesomeClass(); ((MyBase)a).DoSometing(); |
Ausgabe:
Quelltext
1: 2:
| A Awesome Class was created AwesomeClass.DoSometing |
Die erste Zeile ist ja noch logisch.
Es wird ja auch eine AwesomeClass" erzeugt.
Aber bei der 2. hätte ich eher einen Fehler erwartet. immerhin Caste ich nach einer Abstrakten Klasse.
Jetzt meine Frage: Warum reagiert der jetzt genau so?
Ich halte das schon für ein Fehlverhalten oder gibt es da eine Erklärung für?
Ich weiß dass dieses Beispiel nicht Sinnvoll ist, aber ich versuche halt möglichst viele Aspekte der Sprache zu verstehen.
MfG Teekeks
Ralf Jansen - Mo 28.11.11 16:44
Nur weil du auf einen Basistyp castest hast du denn dahinter liegenden Typ ja nicht geändert. Deine MyBase Variable zeigt weiter auf eine AwesomeClass Instanz und beim Aufruf von DoSomething landest du damit logischerweise in der von AwesomeClass überschriebenen Version von DoSomething. Abstrakte Methoden sind zwangsweise virtuell. So ohne weiteres wirst du es also nicht schaffen eine abstrakte Methode aufzurufen um einen Fehler zu provozieren.
Th69 - Mo 28.11.11 16:45
Hallo Peter,
das 'casten' auf die Basisklasse bedeutet nur, daß du dann auch nur Funktionalitäten, welche in der Basisklasse definiert sind, aufrufen kannst (egal ob die Basisklasse nun abstrakt ist oder nicht).
Daher ist auch dein Cast überflüssig, da du in der Zeile darüber eh' schon die Variable 'a' ja als Typ 'MyBase' deklariert hast.
Hättest du jetzt noch eine weitere Methode oder Eigenschaft in deiner abgeleiteten Klasse definiert, so könntest du diese eben nicht über die Basisklasse aufrufen (mittels einen konkreten 'cast' dann aber wieder):
C#-Quelltext
1: 2:
| MyBase a = new AwesomeClass(); ((AwesomeClass)a).DoSomethingOther(); |
Der interne Typ des Objektes ändert sich ja niemals über dessen Laufzeit (d.h. es bleibt in diesem Fall immer ein Objekt der Klasse 'AwesomeClass').
Ralf Jansen - Mo 28.11.11 16:50
| Zitat: |
| Der interne Typ des Objektes ändert sich ja niemals über dessen Laufzeit (d.h. es bleibt in diesem Fall immer ein Objekt der Klasse 'AwesomeClass'). |
Wenn man einen entsprechenden Cast Operator implementiert würde es so Aussehen als ginge das. In diesem konkreten Fall(mit einer abstrakten Klasse als Ziel) hätte man aber dann natürlich im cast Operator weiterhin das Problem eine Instanz dieser abstrakten Klasse zu erzeugen.
Teekeks - Mo 28.11.11 16:51
Ah! danke für eure Antworten.
Wenn man das genau betrachtet habt ihr recht (und auch sonst ;) ).
Mal wieder einen Knoten im Hirn gefunden und beseitigt.
Danke dafür!
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!