| 

.NET C# Java Javascript Exception

6
Es gibt ja die oben genannten Schlüsselworte. Nun sagt der Compiler manchmal sinngemäß so etwas wie: Die Methode XYZ versteckt die Methode ZXY. Wenn das beabsichtigt ist, verwenden Sie das Schlüsselwort new. Dann gibt es noch Override und ich versteh gar nichts mehr.
News:
12.02.2011
Harry88 63 1 1 5
5 Antworten
4
Also :

Wenn du eine Methode virtual machst, kannst du sie in einer ableitung mit override überschreiben.

Ist die die Methode nicht virtual kannst du sie nicht überschreiben. Hinterlegst du trotzdem konnt, wenn du nicht die virtual / override Strategie verwendest, kommt die von dir erwähnte fehlermeldung.
Das soll dich darauf hinweisen, dass u.U. der Code der Basisklassen icht mehr ausgeführt wird.

Du solltest wenn du eine Methode in der Ableitung eine andere / erweiterte Bedeutung geben willst, immer mit virtual und override arbeiten. Nachfolgendes Beispiel zeigt wieso.

Folgende Basisklasse ist gegeben
public class parent
{

public virtual void Write1()
{
Console.WriteLine("Parent");
}

public void Write2()
{
Console.WriteLine("Parent");
}

}


Davon machen wir eine Ableitung

public class child : parent
{
public override void Write1()
{
base.Write1();
Console.WriteLine("Child");
}

public void Write2()
{
base.Write2();
Console.WriteLine("Child");
}
}



Nun Rufen wir die Methoden der Ableitung auf:
static void Main(string[] args)
{
child myBase = new child();

Console.WriteLine(" == Block1 ==");

myBase.Write1(); //=> Gibt aus Parent , Child
myBase.Write2(); // Gibt aus Parent , Child ; Bisher also kein Unterschied

Console.WriteLine();
Console.WriteLine();
Console.WriteLine(" == Block2 ==");

parent myparent = myBase as parent;
myparent.Write1(); //Gibt Parent Child aus
myparent.Write2(); // Gibt nur noch Parent aus ! Der Child code geht verloren!
Console.ReadKey(true);
}


Wie du hier im "Block2" siehst wird der Code des Childs nicht ausgeführt, sobald er als Parent gecastet wurde.

Das kommt daher, dass die Methode nicht virtual ist und die CLR deswegen nach keinen Code in einer abgeleiteten Klasse sucht.

Dieses verhalten kann zu einer Reihe von Problemen führen, deswegen solltest du Methode die man in der Basis ändern kann immer als virtual markieren und in den childs überschreiben.

Mit abstract kannst du definieren dass eine Methode in einer Ableitung code haben _muss_

Hier noch zwei Links zum Thema:
http://www.guidetocsharp.de/Abstract.aspx

http://www.guidetocsharp.de/Virtual.aspx
12.02.2011
Gentlehag 1,0k 3 8
5
Die Kurzfassung:

  • abstract: Ermöglicht Dir, eine Methode ohne Inhalt zu definieren. Dieser muss in einer abgeleiteten Klasse nachgeliefert werden.
  • virtual: Ermöglicht Dir, eine Methode mit Inhalt zu definieren, die in einer abgeleiteten Klasse überschrieben werden kann.
  • override: Muss bei einer überschreibenden Methode angegeben werden, um eine virtual-Methode der Basisklasse zu überschreiben. override ist die explizite Erklärung, dass Du überschreiben willst.
  • new: Wenn die zu überschreibende Methode nicht virtual in der Basisklasse ist, kannst Du override nicht verwenden. Dann brauchst Du new.
12.02.2011
Golo Roden 2,7k 3 9
Anzumerken ist noch, dass mit new versehene Methoden unter Umständen von den Methoden der Elternklasse verdeckt werden. Das führt gern zu sehr viel Sucharbeit.
Hendrik Lösch 14.02.2011
4
Eine als virtual gekennzeichnete Methode, kann in abgeleiteten Klassen überschrieben werden. Stichwort Polymorphie.
Mit dem Modifikator override wird die Methode in abgeleiteten Klassen überschrieben.
public class X1
{
public virtual int Methode()
{
return 1;
}
}

public class X2 : X1
{
public override int Methode()
{
return 2;
}
}

Ist eine Klasse als abstract deklariert, kann man von dieser keine Instanzen anlegen.
Ein Verbergen von Member kann gewollt sein, ist aber meist ein Programmierfehler.
public class X1
{
public int member = 1;
}

public class X2 : X1
{
public int member = 2;
}

Das Feld member in Klasse X2 "versteckt" das Feld member aus Klasse X1.
12.02.2011
Joachim 3,1k 4 9
4
leider hat bis jetzt keiner das Wort "dynamische Bindung" eingeworfen, denn um das geht es hier. In Java gibt es nur dynamische Bindung, aber in C# muss man ausdrücklich sagen wenn man dynamische Bindung machen will. Das sind die Möglichkeiten die man hat:

statische Bindung:
public void Method() {
}

dynamische Bindung (virtual):
public virtual void Method() {
}

dynamische Methode überschreiben (override):
public override void Method() {
}

Ableitungshierarchie für die Methode unterbrechen (new)
gleicher Methodename, aber soll nichts mit der Methode der Basisklasse zu tun haben
statische Bindung:
public new void Method() {
}

dynamische Bindung:
public new virtual void Method() {
}

Ich poste hier ein Beispiel. Zuerst die Klassendefinition und dann die Instanzierung der Objekte und im Kommentar steht welche Funktion aufgerufen wurde.

class A {
public virtual void F() {}
public void G() {}
public virtual void H() {}
}
class B : A {
public new void F() {}
public new virtual void G() {}
public override void H() {}
}
class C : B {
public override void G() {}
public new virtual void H() {}
}

static void Main() {
A a1 = new B();
a1.F(); // A.F();
a1.G(); // A.G();
a1.H(); // B.H();

A a2 = new C();
a2.F(); // A.F();
a2.G(); // A.G();
a2.H(); // B.H();

B b1 = new C();
b.F(); // B.F();
b.G(); // C.G();
b.H(); // B.H();
}

Denk dir das Beispiel durch, dann sollte das Konzept klar sein.
12.02.2011
edures 129 5
Man beachte das Wort Polymorphie!
Joachim 12.02.2011
Polymorhismus = viele Formen haben
virtuelle Methoden eben.
Joachim 12.02.2011
0
Schau mal hier:
http://openbook.galileocomputing.de/visual_csharp_2010/
Wenn du die Kapitel 3 und 4 durcharbeitest, sollte dir vieles klarer werden.
01.03.2011
tb 220 3

Stelle deine .net-Frage jetzt!