Я не понимаю, почему мой вывод не так, как я думаю, должен быть. Я думаю, что это должен быть Собака лает разрыв линии Кошка мяукает. Но там ничего нет.
Код:
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 , но мне очень трудно понять некоторые из приведенных здесь примеров. Если бы кто-то мог сослаться на хороший сайт «Наследство для чайников», он был бы очень признателен.
Сделайте функцию 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."); }
}
}
Модификатор 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 хорошо это объясняет .