Autor Beitrag
Teekeks
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 211
Erhaltene Danke: 23



BeitragVerfasst: Mo 28.11.11 17:08 
Hallo!

ich fuchse mich gerade etwas weiter in C# ein und da ist mir eben was Aufgefallen.

Folgendes Szenario:
ausblenden 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:
ausblenden C#-Quelltext
1:
2:
MyBase a = new AwesomeClass();
((MyBase)a).DoSometing();


Ausgabe:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 28.11.11 17: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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4798
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 28.11.11 17: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):
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Mo 28.11.11 17: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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 211
Erhaltene Danke: 23



BeitragVerfasst: Mo 28.11.11 17: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!