C# 多态
多态性和重写方法
多态性意味着"许多形式",当我们有许多类通过继承相互关联时,多态性就会出现。
如前一章所述,继承允许我们从另一个类继承字段和方法。多态性使用这些方法来执行不同的任务。这允许我们以不同的方式执行单个操作。
例如一个名为Animal
的基类,它有一个名为animalSound()
的方法。衍生的动物可以是猪、猫、狗、鸟,它们也有自己的动物声音(猪叫声,猫叫等)的实现:
实例
class Animal // 基类(父类)
{
public void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // 派生类(子)
{
public void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // 派生类(子)
{
public void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
请记住,在继承一章中,我们使用:
符号从类继承。
现在我们可以创建Pig
和Dog
对象,并对它们调用animalSound()
方法:
实例
class Animal // 基类(父类)
{
public void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // 派生类(子)
{
public void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // 派生类(子)
{
public void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal(); // 创建一个 Animal 对象
Animal myPig = new Pig(); // 创建 Pig 对象
Animal myDog = new Dog(); // 创建 Dog 对象
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
输出将是:
The animal makes a sound
The animal makes a sound
The animal makes a sound
为什么不是我要的结果?
上面示例的输出可能不是您所期望的。这是因为基类方法在派生类方法共享相同名称时覆盖了它们。
但是,C#提供了一个重写基类方法的选项,方法是将virtual
关键字添加到基类内的方法,并对每个派生类方法使用override
关键字:
实例
class Animal // 基类(父类)
{
public virtual void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // 派生类(子)
{
public override void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // 派生类(子)
{
public override void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal(); // 创建一个 Animal 对象
Animal myPig = new Pig(); // 创建 Pig 对象
Animal myDog = new Dog(); // 创建 Dog 对象
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
输出将是:
The animal makes a sound
The pig says: wee wee
The dog says: bow wow
为什么使用"继承"和"多态"?
它对代码的可重用性很有用:在创建新类时重用现有类的字段和方法。