Я новичок в C #, поэтому надеюсь, что если мой вопрос звучит глупо, прошу прощения за мое незнание.

- Я пробовал фундамент Inheritance с C# и обнаружил, что он ведет себя странно, поэтому я решил проверить это с Java, и я получил свой ожидаемый результат.

- Я просто хочу знать, что мне здесь не хватает .......

КОД C #:

 class Animal
 {
   public void Sound()
   {
     System.Console.WriteLine("I don't make any sound");
   }


 } 





 class Dog : Animal
 {
   public void Sound()
   {
     System.Console.WriteLine("barking");


   }  

 }


 class InheritTest
 {
   static void Main()
   {
     Animal a = new Dog();         // Implicit conversion

     Dog    d = (Dog) a;   // Explicit conversion


     a.Sound();
     d.Sound();

   }

 }

ВЫХОД:

I don't make any sound
barking

КОД JAVA:

 class Animal
 {
   public void sound()
   {
     System.out.println("I don't make any sound");
   }


 } 





 class Dog extends Animal
 {
   public void sound()
   {
     System.out.println("barking");


   }  

 }


 class InheritTest
 {
   public static void main(String[] args)
   {
     Animal a = new Dog();         // Implicit conversion

     Dog    d = (Dog) a;   // Explicit conversion


     a.sound();
     d.sound();

   }

 }

ВЫХОД:

barking
barking

- Теперь я сомневаюсь в этом эпизоде ​​... В C# я назначаю Dog object переменной ссылки на объект a типа Animal, затем, когда я вызываю метод Sound() на a, я должен получать вывод как barking (который является переопределенным методом в классе Dog), но вместо этого вызывается метод Animal's Sound(), дающий вывод как I don't make any sound.

- Но в Java все работает должным образом .. Наследование работает одинаково везде, так что где я ошибся?

Буду признателен, если кто-нибудь может мне с этим помочь ...... Заранее спасибо.

0
Kumar Vivek Mitra 5 Май 2014 в 09:37

3 ответа

Лучший ответ

В вашем первом примере вы фактически не переопределяете существующий метод - вы его скрываете. Это особый механизм C #, который отличается от традиционного переопределения метода. Отметьте исходный метод как virtual и переопределите метод как override, чтобы он работал должным образом. Вот хорошее объяснение. Разве вы не получали об этом предупреждения?

5
Community 23 Май 2017 в 12:11

В Java (IIRC) по умолчанию используются методы virtual. В C # это не так.

Пометьте свои методы C # как virtual и override их. Это даст ожидаемый результат.

3
Simon Whitehead 5 Май 2014 в 05:40

Рассмотрим код

Animal a = new Dog();
a.sound();

Чтобы вызвать звуковой метод, среда выполнения должна сначала определить фактический тип объекта (Dog), а затем вызвать для него звуковой метод. Если метод (звук) не существует для типа (Dog), ему необходимо вызвать метод для типа времени компиляции (Animal).

Как видите, этот процесс может занять некоторое время и может повлиять на производительность. Чтобы сделать этот процесс более эффективным, C # использует нечто, называемое «виртуальными таблицами», тогда как Java использует технику, называемую динамической диспетчеризацией во время выполнения. Это означает, что в C # нам нужно пометить метод как виртуальный, чтобы сообщить компилятору, что ему необходимо выполнить поиск по базовому типу. Таким образом, программа потребляет намного меньше памяти и работает быстрее, чем если бы каждый объект должен был проверять, какой фактический метод необходимо вызвать. Однако это также означает, что каждый метод теперь должен быть помечен как виртуальный, чтобы сообщить компилятору, что нам нужна виртуальная таблица для поиска метода.

В общем, это разница в философии дизайна. Java упрощает программистам расширение класса, не беспокоясь о том, какие функции помечать как виртуальные, делая все функции виртуальными по умолчанию. С другой стороны, C # требует, чтобы вы пометили функцию как виртуальную, если вы хотите, чтобы функциональность была переопределена в производном классе. Это также помогает исключить непреднамеренно переопределяющую функциональность базовых классов. (В C # методы в базовом классе должны быть помечены как виртуальные и переопределяться в производных классах)

0
user3603121 5 Май 2014 в 06:21