2010-08-16 7 views
9

Я не понимаю, почему мой результат не так, как я думаю, это должно быть. Я думаю, что это должно быть собака лает линия перерыва Cat мяу. Но там ничего нет.вопрос о наследовании новичков

Код:

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

Я попытался пройти через c# programming guide on MSDN, но я считаю его очень трудно понять некоторые из примеров там. Если бы кто-то мог ссылаться на хороший сайт «наследование для чайников», он был бы очень признателен.

+1

То, как вы используете Домашние животные, больше похоже на интерфейс – Joakim

+0

Я бы де-плюрализую домашних животных для домашних животных. –

+1

Я бы повторно плюрализую Домашние животные для домашних животных. –

ответ

18

сделать функцию говорящая в базовом классе виртуального, а затем переопределить эту функцию в ваших производных классах:

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 модификатор, как вы написали это:

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

по существу означает, что определяемый вами метод Say вызывается только тогда, когда этот экземпляр используется в качестве примера Dog.

Так

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

Это объясняет, почему вы получили результаты, которые вы имеют; для чего вы хотите, используйте виртуальные методы - @fletcher's answer explains it well.

+0

+1 Я даже не знал, что вы можете использовать новое ключевое слово таким образом, wierd. –

Смежные вопросы