Skip to content

Instantly share code, notes, and snippets.

@d630
Last active June 12, 2018 21:12
Show Gist options
  • Save d630/0a40dd80428e4983bc58ff9ae3ae6ad6 to your computer and use it in GitHub Desktop.
Save d630/0a40dd80428e4983bc58ff9ae3ae6ad6 to your computer and use it in GitHub Desktop.
Vererbung 2: virtual, new, override (Polymorphismus)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace csharp
{
public class Person
{
protected string vorname;
protected string nachname;
public Person (string vorname, string nachname)
{
this.vorname = vorname;
this.nachname = nachname;
}
public void who()
{
Console.WriteLine(this.vorname + " - " + this.nachname);
}
public virtual void hello()
{
Console.WriteLine("hello {0} {1}!!!", this.vorname, this.nachname);
}
}
public class Schueler : Person
{
private char klasse;
public Schueler(string vorname, string nachname, char klasse) : base(vorname, nachname)
{
this.klasse = klasse;
}
public new void who()
{
base.who();
Console.WriteLine(this.vorname + " " + this.nachname[0] + ".");
}
public override void hello()
{
base.hello();
Console.WriteLine("hello {0} {1}", this.vorname, this.nachname);
}
}
public class Lehrer : Person
{
private string fach;
public Lehrer(string vorname, string nachname, string fach) : base(vorname, nachname)
{
this.fach = fach;
}
public new void who()
{
base.who();
Console.WriteLine(this.nachname + ", " + this.vorname);
}
public override void hello()
{
base.hello();
Console.WriteLine("hello {0} {1}", this.vorname, this.nachname);
}
}
public class Program
{
static void Main(string[] args)
{
Lehrer l = new Lehrer("mahatma", "gandhi", "protest");
Schueler s = new Schueler("mahatma", "gandhi jr.", 'A');
Console.WriteLine("new keyword: ");
l.who();
s.who();
((Person)s).who();
Console.WriteLine("override keyword: ");
l.hello();
s.hello();
((Person)s).hello();
Person p = new Lehrer("mahatma", "gandhi", "protest");
p.who(); // the actual type of the object that the reference refers to is used
p.hello(); // version in the derived class is used
}
}
}
@d630
Copy link
Author

d630 commented Jun 12, 2018

Wenn new in der abgeleiteten Klasse benutzt wird, dann wird der Member aus der Superklasse lediglich versteckt. Ob dann der Member aus der Superklasse oder der deklarierte aus der Subklasse benutzt wird, hängt dann von dem Typ der Referenz ab (Zeile 93).

Wenn virtual und override gesetzt sind, dann wird der Member aus der Superklasse in der Subklasse erweitert. Es wird dann in jedem Fall der überschriebene Member aus der Subklasse aufgerufen.

Ob jemals ein Member in einer Subklasse überschrieben werden kann, hängt also davon ab, ob der Erfinder der Superklasse virtual gesetzt hat.

Wenn in der Subklasse ein Member aus Superklasse "überschrieben" ist, aber überhaupt keine Schlüsselwörter gesetzt sind, dann gilt ein implizites new und der Compiler gibt eine Warnung aus.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment