2016-09-09 3 views
0

Я вставив следующий код:Почему абстрактный метод не выполняется в следующем коде?

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(); 
     } 
    } 

Я не могу понять, почему выше Абстрактный класс не выполняется? приведенный выше код работает отлично, что также дает выход. Мой вопрос даже после переопределения абстрактного метода в классе программы еще при вызове метода add(), почему выполняется не абстрактный метод, а абстрактный метод - нет?

Кроме того, если я изменить программу:

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(); 
    } 
} 

Тогда мой абстрактный метод выполнения и дает мне желаемого результата. Пожалуйста, объясните кого-нибудь. что на самом деле происходит в строке ниже. Я знаю, это очень простой вопрос, но я немного смущен здесь. пожалуйста помоги ! Заранее спасибо.

test obj = new Program(); 
+3

Что именно происходит иначе, чем вы ожидаете? – Blorgbeard

+0

Что вы можете задать здесь? –

+0

, как указано выше, также вы не используете свой абстрактный класс. Возможно, вы хотите выполнить «test obj = new Program();», который создаст новую программу, но сохранит ее как «тест» –

ответ

2

Это потому, что любой метод, объявленный в классе вывода, имеет больше приоритета, чем базовые унаследованные методы.

Если вы хотите позвонить add(int a, int b), вам необходимо сообщить компилятору, что add(decimal a, decimal b) не существует. Это литье его 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(); 
    } 
} 

Если вы не хотите, чтобы бросить его, вы можете объявить add(decimal a, decimal b); в абстрактный класс. Нравится так:

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

спасибо за быстрый ответ @Bob, но тогда, когда я выполнил ваш второй код, почему я только получаю добавление, а не как i, «дополнение», так и «десятичное дополнение» на выходе консоли? – Tony

+0

@ Тони, почему вы ожидаете вызова обеих перегрузок? –

+1

Вы никогда не сможете выполнить два метода с помощью 1 вызова. Для этого вам нужно будет позвонить дважды. Второй - 'obj.add (10m, 111m);', где 'm' сообщит компилятору, это десятичное число – Bob