2016-09-09 2 views
0

Ich bin Einfügen den Code unten:Warum wird die abstrakte Methode im folgenden Code nicht ausgeführt?

abstract public class test 
    { 
     abstract public void add(int a, int b); 

    } 

    class Program : test 
    { 
     public void add(decimal a, decimal b) 
     { 
      decimal c = a + b; 
      Console.WriteLine("Decimal Addition : {0}", c); 
     } 

     public override void add(int a, int b) 
     { 
      int c = a + b; 
      Console.WriteLine("Addition : {0} ", c); 
     } 
     static void Main(string[] args) 
     { 
      Program obj = new Program(); 
      obj.add(10, 111); 
      Console.ReadLine(); 
     } 
    } 

ich nicht in der Lage bin zu verstehen, warum die obige Zusammenfassung Klasse nicht ausgeführt wird? der obige Code läuft perfekt, was auch die Ausgabe produziert. Meine Frage ist auch nach dem Überschreiben der abstrakten Methode in der Program-Klasse immer noch beim Aufruf der add() -Methode, warum die nicht abstrakte Methode ausgeführt wird und die abstrakte Methode nicht?

Auch wenn ich das Programm zu ändern:

abstract public class test 
{ 
    abstract public void add(int a, int b); 

} 

class Program : test 
{ 
    public void add(decimal a, decimal b) 
    { 
     decimal c = a + b; 
     Console.WriteLine("Decimal Addition : {0}", c); 
    } 

    public override void add(int a, int b) 
    { 
     int c = a + b; 
     Console.WriteLine("Addition : {0} ", c); 
    } 
    static void Main(string[] args) 
    { 

     test obj = new Program(); 
     obj.add(10, 111); 
     Console.ReadLine(); 
    } 
} 

Dann meine abstrakte Methode ausführt und mir gewünschtes Ergebnis. Bitte erklären Sie es jemandem. Was passiert eigentlich in der Zeile darunter? Ich weiß es sehr grundlegende Frage, aber ich bin etwas verwirrt hier. bitte hilfe! Danke im Voraus.

test obj = new Program(); 
+3

Was genau passiert anders als Sie erwarten? – Blorgbeard

+0

Was ist deine Frage hier? –

+0

wie oben gesagt, auch, Sie verwenden nicht wirklich Ihre abstrakte Klasse. Vielleicht wollen Sie 'test obj = new Program();' machen, das ein neues Programm erstellt, aber als "test" hält –

Antwort

2

Das liegt daran, dass jede Methode, die in der Ablei- tungsklasse deklariert ist, eine höhere Priorität hat als die geerbte Methode. Wenn Sie add(int a, int b) anrufen möchten, müssen Sie dem Compiler mitteilen, dass add(decimal a, decimal b) nicht existiert. Dies ist durch sie test

abstract public class test 
{ 
    abstract public void add(int a, int b); 

} 

class Program : test 
{ 
    public void add(decimal a, decimal b) 
    { 
     decimal c = a + b; 
     Console.WriteLine("Decimal Addition : {0}", c); 
    } 

    public override void add(int a, int b) 
    { 
     int c = a + b; 
     Console.WriteLine("Addition : {0} ", c); 
    } 
    static void Main(string[] args) 
    { 
     test obj = new Program(); 
     obj.add(10, 111); 
     Console.ReadLine(); 
    } 
} 

Gießen Wenn Sie es nicht werfen möchten, können Sie add(decimal a, decimal b); in die abstrakte Klasse deklarieren können. Gefällt mir:

abstract public class test 
{ 
    abstract public void add(int a, int b); 

    abstract public void add(decimal a, decimal b); 
} 

public class Program : test 
{ 

    public override void add(int a, int b) 
    { 
     int c = a + b; 
     Console.WriteLine("Addition : {0} ", c); 
    } 
    public override void add(decimal a, decimal b) 
    { 
     decimal c = a + b; 
     Console.WriteLine("Decimal Addition : {0}", c); 
    } 
    public static void Main(string[] args) 
    { 
     Program obj = new Program(); 
     obj.add(10, 111); 
     Console.ReadLine(); 
    } 
} 
+0

danke für die schnelle Antwort @Bob, aber dann, wenn ich Ihren zweiten Code ausgeführt, warum ich nur Addition und nicht beide, nämlich "Addition" und "Decimal Addition" in der Konsolenausgabe bekommen? – Tony

+0

@Tony Warum erwarten Sie, dass beide Überladungen aufgerufen werden? –

+1

Sie können niemals zwei Methoden mit einem Aufruf ausführen. Um das zu tun, müssen Sie zweimal anrufen. Der zweite ist 'obj.add (10m, 111m);', wobei 'm' dem Compiler sagt, dass dies eine Dezimalzahl ist – Bob

Verwandte Themen