2010-08-16 15 views
9

No entiendo por qué mi salida no es como creo que debería ser. Creo que debería ser Perro ladra salto de línea Gato muerde. Pero no hay nada allí.pregunta de herencia novato

Código:

namespace ConsoleApplication2 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     Pets pet1 = new Dog(); 
     Pets pet2 = new Cat(); 
     pet1.Say(); 
     pet2.Say(); 
     Console.ReadKey(); 
    } 
    } 

    class Pets 
    { 
    public void Say() { } 
    } 

    class Dog : Pets 
    { 
    new public void Say() { Console.WriteLine("Dog barks."); } 
    } 

    class Cat : Pets 
    { 
    new public void Say() { Console.WriteLine("Cat meows."); } 
    } 
} 

he tratado de pasar por el c# programming guide on MSDN pero me resulta muy difícil de entender algunos de los ejemplos de la existencia. Si alguien pudiera enlazar a un buen sitio de "herencia para tontos", sería muy apreciado.

+1

La forma en que usa Mascotas es más como una interfaz – Joakim

+0

Despliegue las mascotas a mascotas. –

+1

Repluralizaría Mascotas a Mascotas. –

Respuesta

18

Realiza la función de decir en su clase base virtual y luego anular esta función en sus clases derivadas:

namespace ConsoleApplication2 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     Pets pet1 = new Dog(); 
     Pets pet2 = new Cat(); 
     pet1.Say(); 
     pet2.Say(); 
     Console.ReadKey(); 
    } 
    } 

    class Pets 
    { 
    public virtual void Say() { 
     Console.WriteLine("Pet makes generic noise"); 
} 
    } 

    class Dog : Pets 
    { 
    public override void Say() { Console.WriteLine("Dog barks."); } 
    } 

    class Cat : Pets 
    { 
    public override void Say() { Console.WriteLine("Cat meows."); } 
    } 
} 
13

El modificador new como usted ha escrito que:

class Dog : Pets 
{ 
new public void Say() { Console.WriteLine("Dog barks."); } 
} 

significa esencialmente que el método Say que ha definido solo se invoca cuando se utiliza esa instancia como una instancia de Dog.

Así

Dog dog = new Dog(); 
dog.Say(); // barks (calls Dog.Say) 
Pet pet = dog; 
pet.Say(); // nothing (calls Pet.Say) 

Eso explica por qué recibió los resultados que tiene ; para lo que quería, use métodos virtuales - @fletcher's answer explains it well.

+0

+1 Nunca supe que podrías usar la nueva palabra clave de esta manera, extraño. –

Cuestiones relacionadas