2016-03-21 4 views

Antwort

2

In C# können Sie nur Methoden überschreiben, die virtuell markiert sind. Versuchen Sie stattdessen

class Baseclass 
{ 
    public virtual void fun() 
    { 
     Console.WriteLine("Hi "); 
    } 
} 


class Derived : Baseclass 
{ 
    public override void fun() 
    { 
     Console.Write("Bye "); 
    } 
} 

Wenn Sie override in Funktion Signaturen setzen, kompilieren erfordert eine passende virtuelle Methode (Signaturen und Rückgabetyp beide) in der Basisklasse, die nicht existiert, so wird ein Fehler ausgelöst.

Wenn Sie Überschreibungen entfernen Schlüsselwort, das eigentlich die Methode von BaseClass versteckt, aber das nicht überschreibt. In diesem Fall löst der Compiler nur eine Warnung aus und kompiliert weiter.

Es gibt einen kleinen Unterschied zwischen zwingenden und versteckt See Overriding vs method hiding für mehr Details

+0

OK. Es funktioniert also so, als würde das "neue" Keyword verwendet werden aber ist nicht so das Warin erscheint :) jetzt verstehe ich das Problem. Vielen Dank! –

+0

Nun, Sie müssen 'new' Schlüsselwort nur, wenn Sie die Methode ausblenden möchten. Wenn Sie überschreiben möchten, markieren Sie die Methode in der Basisklasse als virtuell. Das Ausblenden der Methode zeigt kein polymorphes Verhalten. –

0

C# enthält ein Schlüsselwort virtual, die Sie Mitglieder werden außer Kraft gesetzt in abgeleiteten Klassen markieren können.

Der Grund wie in der Dokumentation angegeben ist:

standardmäßig Methoden sind nicht virtuell. Sie können eine nicht virtuelle Methode nicht überschreiben.

Warum haben die Sprachdesigner das so gemacht, wo Sie explizit angeben müssen, dass eine Methode überschrieben werden kann? Ich kann nicht für sie sprechen, aber es scheint offensichtlich, dass sie Programmierern einen sicheren Weg geben wollten, Mitglieder aus Versehen zu umgehen. Das scheint der offensichtlichste Sieg hier zu sein.

Wenn Sie also eine Klasse entwerfen, sollten Sie Klassen, die Sie als virtuell übergangen haben, als markiert markieren.

Sie können mehr über MSDN lesen.

So Sie Basisklasse wird wie folgt aussehen:

class Baseclass 
{ 
    public virtual void fun() 
    { 
     Console.WriteLine("Hi "); 
    } 

    public void fun(int i) 
    { 
     Console.Write("Hello "); 
    } 
} 

Natürlich können Sie auch virtual auf die überladene Methode unter einen int hinzufügen könnte.

+0

Es ist klar und wahr, was Sie gesagt haben. Aber es ist nicht die Antwort auf die "Gibt es eine logische Erklärung?" Frage zum Compiler-Verhalten;) –

+0

'Sie können mehr auf MSDN lesen. Es ist die wahre Tatsache über jede Frage als C# bezogen bezogen;) –

Verwandte Themen