Verständnisproblem mit virtuelle Methoden

Hallo,

ich verstehe den Unterschied zwischen einer virtuellen und normalen Methode nicht.
Habe ich eine Basisklasse mit viruellen Methoden, kann ich diese in den Kindklassen überschreiben. Bei abstrakten Methoden MUSS ich diese hingegen überschreiben.
Aber ich kann doch auch normale public-Methoden in Kindklassen überschreiben.

Wo ist da jetzt der Unterschied?
Warum soll ich virtual davor schreiben, wenns auch so geht?

Hi,
Du hast die Klasse „Tier“, diese Klasse ist die Basisklasse für die Klasse „Hund“ und „Katze“. Wenn du nun in Tier die virtuelle Methode getAnimal(); geschrieben hast, kannst du diese in den Kindklassen überschreiben. Wenn du aber nun eine Kindklasse „Terrier“ erstellst, die von Hund ableitet kannst du getAnimal(); nicht überschreiben.
Der Sinn ist von bestimmten Klassen manche Methoden zu schützen.
Lg der einzigware

Hi,
lies dir das mal durch und wenn dir an den Beispielen was nicht klar ist, dann melde dich einfach noch mal.

Virtuelle Methoden

Gruss
Joey

Hi,

sorry, aber das ist Unsinn. Vielleicht verwechselst du das mit sealed,protected oder internal-Methoden.

Kompiliere das Ganze mal und du wirst feststellen, dass virtuelle Methoden in erster Linie dazu da sind damit die Methoden der abgeleiteten Klasse Vorrang vor der gleichen Methode der Basisklasse hat.

Gruss
Joey

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace test
{
 class tier
 {
 public virtual string getAnimal()
 {
 return "Ich bin ein Tier";
 }

 }

 class Hund:tier
 {
 public override string getAnimal()
 {
 return "Ich bin ein Hund";
 }

 }

 class Terrier: Hund 
 {
 public override string getAnimal()
 {
 return "Ich bin ein Terrier";
 }

 }
 class Program
 {
 static void Main(string[] args)
 {

 tier dasTier = new tier();
 Console.WriteLine( dasTier.getAnimal());

 Hund derHund = new Hund();
 Console.WriteLine(derHund.getAnimal());

 Terrier derTerrier = new Terrier();
 Console.WriteLine(derTerrier.getAnimal());

 tier dasHundTier = new Hund();
 Console.WriteLine(dasHundTier.getAnimal());

 tier dasTerrierTier = new Terrier();
 Console.WriteLine(dasTerrierTier.getAnimal());

 Hund derTerrierHund = new Terrier();
 Console.WriteLine(derTerrierHund.getAnimal());

 Console.ReadLine();
 }
 }
}

Hi,
stimmt hast recht:smile: Ich benutze die recht selten deswegen verwechsel ich die hin und wieder.
Lg der einzigware

Danke! Das hat mir weiter geholfen. Denke, ich habs jetzt verstanden.

Der Unterschied besteht im Zusammenhang mit override. Bei normalen Methoden muss ich das Schlüsselwort new verwenden.