2010-08-16 34 views
9

Neden çıktı almam gerektiğini düşündüğümden emin değilim. Bence köpek kıvrımları çizgi kırıcı Kedi miyavları olmalı. Ama orada hiçbir şey yok.acemi miras sorumlusu

Kodu:

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

ben c# programming guide on MSDN geçmesi denedi ama çok zor orada örneklerden bazılarını anlamak bulabilirsiniz. Birisi iyi bir "mankenler için miras" sitesine bağlanabilirse, çok takdir edilecektir.

+1

Evcil hayvanı kullanma şekliniz daha çok bir Arayüz – Joakim

+0

Arabirimine benziyor. –

+1

Evcil hayvanı tekrar evcil hayvanlara dönüştürürdüm. –

cevap

18

sanal Baz sınıfta Say işlevini yapın ve ardından türetilmiş sınıfları bu işlevi geçersiz:

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

bunu yazdım olarak new değiştirici:

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

esasen demektir Tanımladığınız Say yöntemi, yalnızca örneğinde kullanıldığında çağrılır. Eğer sahip sonuçları neden aldığınızı

Yani

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

açıklıyor; Ne istediğin için, sanal yöntemleri kullanın - @fletcher's answer explains it well.

+0

+1 Yeni anahtar kelimeyi bu şekilde kullanabileceğinizi hiç bilmiyordum, wierd. –