вопрос о наследовании новичков

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

Код:

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 # в MSDN , но мне очень трудно понять некоторые из приведенных здесь примеров. Если бы кто-то мог сослаться на хороший сайт «Наследство для чайников», он был бы очень признателен.

9
задан Jim 16 August 2010 в 18:17
поделиться

2 ответа

Сделайте функцию Say в базовом классе виртуальной, а затем переопределите эту функцию в производных классах:

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."); }
  }
}
18
ответ дан 4 December 2019 в 07: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 хорошо это объясняет .

13
ответ дан 4 December 2019 в 07:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: