2010-08-16 3 views
9

Je ne comprends pas pourquoi ma sortie n'est pas ce que je pense qu'elle devrait être. Je pense que cela devrait être Chien aboie ligne chat Cat miaou. Mais il n'y a rien là.question d'héritage novice

code:

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."); } 
    } 
} 

J'ai essayé de passer par le c# programming guide on MSDN mais je trouve qu'il est très difficile de comprendre quelques-uns des exemples sur là-bas. Si quelqu'un pouvait créer un lien vers un bon site d'héritage pour les nuls, ce serait très apprécié.

+1

La façon dont vous utilisez les animaux de compagnie ressemble plus à une interface – Joakim

+0

Je désolidariserais Pets to Pet. –

+1

Je re-pluraliser les animaux domestiques aux animaux domestiques. –

Répondre

18

Faire la fonction Say dans virtuelle votre classe de base, puis remplacer cette fonction dans vos classes dérivées:

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

Le modificateur new comme vous l'avez écrit:

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

signifie essentiellement que la méthode Say que vous avez définie n'est appelée que lorsque cette instance est utilisée comme instance de Dog.

Alors

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

Cela explique pourquoi vous avez reçu les résultats que vous avez ; pour ce que vous voulez , utilisez des méthodes virtuelles - @fletcher's answer explains it well.

+0

+1 Je n'ai jamais su que vous pourriez utiliser le nouveau mot-clé de cette façon, wierd. –