C#中继承的奇怪行为

Kum*_*tra 0 c# java inheritance implicit-conversion explicit-conversion

我对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();

   }

 }
Run Code Online (Sandbox Code Playgroud)

输出:

I don't make any sound
barking
Run Code Online (Sandbox Code Playgroud)

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

   }

 }
Run Code Online (Sandbox Code Playgroud)

输出:

barking
barking
Run Code Online (Sandbox Code Playgroud)

-现在我对这整集的疑问是..在C#我分配Dog objecta类型的对象引用变量中Animal,然后当我调用方法Sound()a,我应该得到输出为barking(这是Dog类中的重写方法)而是Animal's Sound()方法被称为输出为I don't make any sound.

-Java事情正在按预期工作.继承在任何地方的工作方式都是一样的,所以我哪里出错了.

如果有人可以帮我解决,我将不得不......提前致谢.

Max*_*kov 5

在您的第一个示例中,您实际上并没有覆盖现有方法 - 您正在隐藏它.它是一种特殊的C#机制,与传统的方法覆盖不同.将源方法标记为virtual并覆盖方法override,使其按预期工作.这是一个很好的解释.你没有收到警告吗?