2010-08-16 18 views
9

Nie rozumiem, dlaczego moje wyniki nie są takie, jak myślę, że powinny być. Myślę, że to powinno być psie przerażenie z linii Cat Miau. Ale nic tam nie ma.pytanie o dziedziczenie nowicjusza

Kod:

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

Próbowałem przejść przez c# programming guide on MSDN ale uważam, że bardzo trudno jest zrozumieć niektóre z przykładów na nie. Gdyby ktoś mógł zamieścić link do strony z "dziedzictwem dla manekinów", byłoby to bardzo cenne.

+1

Sposób, w jaki używasz Zwierzęta, jest bardziej podobny do interfejsu – Joakim

+0

Odmieszkalibyśmy zwierzęta domowe na zwierzęta domowe. –

+1

Przeliczyłbym zwierzęta na zwierzęta. –

Odpowiedz

18

Dodać funkcję powiedzenia w swojej klasie bazowej wirtualnego, a następnie zastąpić tę funkcję w swoich klasach pochodnych:

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

new modyfikator jak napisałeś go:

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

zasadniczo oznacza, że zdefiniowany przez ciebie kod Say jest wywoływany tylko wtedy, gdy ta instancja jest używana jako jako instancja Dog.

Więc

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

To wyjaśnia, dlaczego otrzymała wyniki masz; dla tego, co chcesz chciał, użyj metod wirtualnych - @fletcher's answer explains it well.

+0

+1 Nigdy nie wiedziałem, że możesz użyć nowego słowa kluczowego w ten sposób, dziwne. –