Last active
June 12, 2018 21:12
-
-
Save d630/0a40dd80428e4983bc58ff9ae3ae6ad6 to your computer and use it in GitHub Desktop.
Vererbung 2: virtual, new, override (Polymorphismus)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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
undoverride
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.