2017-08-28 7 views
-6

Ich muss eine echte Klasse Unterklasse, ich meine nicht eine abstrakte Klasse. Ich brauche ein neues Verhalten.C# Vererbung funktioniert nicht

namespace MyProgram 
{ 
    public class ParentClass 
    { 
     public int Calc(int a) 
     { 
      return a + this.Cal(); 
     } 

     public int Cal() 
     { 
      return 2; 
     } 
    } 

    public class ChildClass : ParentClass 
    { 
     public int Cal() 
     { 
      return 1; 
     } 
    } 
} 

Im Hauptprogramm habe ich versucht, die folgenden:

ChildClass childClass = new ChildClass(); 
int a = childClass.calc(3); 

Der Wert von a ist jedoch, 5 und 4 nicht

+1

Welche schreckliche Namenskonvention so verwirrend Code. – JonH

+0

[Wissen, wann Override und neue Schlüsselwörter zu verwenden] (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/knowing-when-to-use-override- und-new-keywords) –

+0

Namenskonvention behoben ... – JonH

Antwort

4

Sie müssen die cal() Methode markieren als in parentclass und override es in childclass.

namespace MyProgram 
{ 
    public class ParentClass 
    { 
     public int calc(int a) 
     { 
      return a + this.cal(); 
     } 

     public virtual int cal() 
     { 
      return 2; 
     } 
    } 

    public class childClass : ParentClass 
    { 
     public override int cal() // same name and firm 
     { 
      return 1; 
     } 
    } 
} 
+0

gleicher Name und Firma? was ist das (fest)? – JonH

+0

@JonH - wer weiß, aber es ist auch im OP. Wahrscheinlich nur ein Kopieren/Einfügen und dann virtuelles + Override an den entsprechenden Stellen hinzugefügt. – Igor

+0

das habe ich gemacht :). Ich nehme an, er meinte, Methode hat die gleiche Signatur wie die Eltern. – AlexDrenea

1

Grundsätzlich, wenn Sie eine Methode wie public int cal() { return 2; } definieren Sie sagen, dass es immer so sein wird. Auf diese Weise versucht es, wenn es innerhalb der Klasse (return a + this.cal()) aufgerufen wird, nicht einmal eine andere Implementierung zu finden. Wenn Sie die Option zum Überschreiben der Implementierung haben möchten, müssen Sie die Methode als virtual markieren. Wenn Sie in der untergeordneten Klasse die Methode überschreiben möchten, müssen Sie explizit angeben, dass es sich um eine Außerkraftsetzung handelt, die das Schlüsselwort override verwendet.

namespace MyProgram 
{ 
    public class ParentClass 
    { 
     public int calc(int a) { return a + this.cal(); } 
     public virtual int cal() { return 2; } 
    } 

    public class childClass : ParentClass 
    { 
     public override int cal() 
     { 
      return 1; 
     } 
    } 
} 
+0

Zwei Dinge. 1) Ich bin mir ziemlich sicher, dass Sie nicht "virtuell" in Ihre Methodendefinition in Ihrer ersten Zeile einbeziehen wollten. Dieser Fehler macht den ganzen Satz für einen Noob eher verwirrend. 2) Eine override-Klasse * könnte * auch ihr eigenes Verhalten ändern, indem sie das Schlüsselwort 'new' verwendet. – Igor

+0

Danke!Ich tat es tatsächlich nicht. Fest! Das Schlüsselwort 'new' ist das Standardverhalten (verbirgt im Grunde nur Warnungen). Die override-Klasse, die das Schlüsselwort 'new' verwendet, funktioniert nur, wenn die Methode im Kontext dieser Klasse aufgerufen wird. Verwenden Sie zum Beispiel das Schlüsselwort 'new' im Beispiel über dem Ergebnis von' childClass child = new childClass; child.cal(); 'würde wie erwartet 1 ergeben. Aber, ParentClass Parent = new childClass; parent.cal(); 'wird Ergebnis 2. –

+0

Danke an alle, ja mein Englisch ist sehr schlecht, ich verstehe, dass ich eine nicht virtuelle oder abstrakte Methode nicht überschreiben kann. https://docs.microsoft.com/en-us/dotnet/csharp/tutorials/inheritance –