Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 28.12.13 15:32 
Hallo zusammen,
ich habe leider kein Unterforum für UML oder Klassendiagramme gefunden und hoffe ich bin hier in den Basistechnologien nicht ganz falsch.


Ich habe eine Basisklasse "Figur" und eine Subklasse "Linie"
Beide Klassen haben eine Methode namens "Zeichnen"

Nach meiner Auffassung erbt die Subklasse ja alle Attribute und Methoden der Basisklasse.
Hat die Klasse Linie jetzt 2 x "Zeichnen", oder überschreibt/überlagert die spezialisierte Methode die Methode der Basisklasse?!

Vielen Dank

Viele Grüße
Daniel
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: Sa 28.12.13 20:01 
Wenn die Methode in der Subklasse genannt wird heißt das nur das die geerbte Methode überschrieben wird. Ob die in C# nun überschrieben via override oder überlagert via new wird ist glaube ich dem Klassendiagramm nicht zu entnehmen. Soweit ich weiß kennt UML den unterschied nicht mal bzw kennt überlagern nicht.

Heißt das in Deutsch tatsächlich überlagern? Die MSDN spricht meist von ausblenden.
Hidden in englisch ist zwar auch nicht toll aber zumindest eindeutig ;)
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 28.12.13 20:13 
Ausblenden oder verstecken passt eigentlich gerade nicht. Denn die Methode ist ja noch aufrufbar und vorhanden, sie ist nur bei Verwendung der konkreten Klasse mit der neuen Implementierung durch diese überlagert. Beispiel:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
    class Test
    {
        public void TestMe()
        {
            Console.WriteLine("a");
        }
    }

    partial class Test1 : Test
    {
        public void TestMe()
        {
            Console.WriteLine("b");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Test a1 = new Test1();
            a1.TestMe();
            Test1 a2 = new Test1();
            a2.TestMe();
            Console.ReadLine();
        }
    }
Die Ausgabe ist natürlich:
ausblenden Quelltext
1:
2:
a
b
Insofern klingt überlagern in dem Zusammenhang gar nicht so schlecht...
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: Sa 28.12.13 20:35 
Das hängt doch wohl sehr vom Blickwinkel ab ;)
Wenn ich die Basisklasse betrachte ist deren Methode erstmal ~hidden~ also eher versteckt. Wenn ich das von der Subklasse aus betrachte dann überlagert die Methode die der Basisklasse.

Im englischen hat man sich für den Basisklassen Blickwinkel entschieden. Ich hab da noch keine festgefahrene Meinung würde es aber im Moment vorziehen wenn man im deutschen dann auch sprachlich den selben Blickwinkel einnimmt. Wenn denn versteckt, zumindest in meinen Ohren, nicht so blöd klingen würde ;)
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Sa 28.12.13 23:13 
Hi,
danke für die ausführlichen Erläuterungen.

Also hat die Subklasse auch die Methode der Basisklasse, die aufrufbar wäre.

Ich glaube ich habe noch eine ganze Menge vor mir bis ich mal da bin wo ich hin will :-)

lg
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 29.12.13 00:05 
user profile iconTalemantros hat folgendes geschrieben Zum zitierten Posting springen:
Also hat die Subklasse auch die Methode der Basisklasse, die aufrufbar wäre.
Richtig. Zur Erklärung stell dir deine Klasse als Aktenordner vor. Darin stehen nun die einzelnen Seiten mit den aufrufbaren Methoden. Beim Kompilieren wird aus dem Aufruf einer solchen Methode "Rufe mal das auf was auf Seite XY steht".

Wird nun eine neue abgeleitete Klasse erstellt, werden die Seiten der Elternklasse kopiert und in den Ordner der abgeleiteten Klasse übernommen. Sprich eine Klasse hat immer nur einen Ordner mit allen Definitionen, nutzt also keine Verlinkung auf die Elternklasse dafür.

Wird nun eine Methode beim Kompilieren gesucht, wird zuerst die der aktuellen Klasse gefunden, so dass eine gleichnamige der Elternklasse nicht aufgerufen wird. Packst du aber dein Objekt in eine Variable vom Typ der Elternklasse, wird deren Teil der Tabelle der Klasse als Startpunkt der Suche benutzt. Da steht aber noch die Methode der Elternklasse drin, so dass diese aufgerufen wird.

So, nun wird eine Methode überschrieben. Das bedeutet, dass keine neue Definition hinzugefügt wird, sondern die erste Definition in dem Aktenordner durch die neue ersetzt wird.
Egal von wo du nun anfängst zu suchen, du findest in dem Aktenordner immer nur die neue Definition. Deshalb ist es dann egal von welchem Typ die Variable ist, in dem das Objekt liegt.

Zu den Begriffen:
Der Aktenordner ist dabei die Virtual Method Table, die Definition, die darin ersetzt wird, ein Pointer mit der Adresse, an der die Befehle für die Methode stehen.
Die Abgrenzung Klasse vs. Objekt solltest du dir ggf. noch einmal separat anschauen, das wollte ich hier nicht auch noch einbauen, es sollte ja einfach bleiben. ;-)