C# 多态
多态和方法重写
多态意为“多种形式”,当我们有多个类通过继承相互关联时就会发生多态。
就像我们在上一章中指定的;继承 允许我们从另一个类继承字段和方法。多态使用这些方法执行不同的任务。这使我们能够以不同的方式执行单个操作。
例如,考虑一个名为 Animal
的基类,它有一个名为 animalSound()
的方法。动物的派生类可以是猪、猫、狗、鸟 - 它们也有自己动物声音的实现(猪发出哼哼声,猫发出喵喵声,等等)。
示例
class Animal // Base class (parent)
{
public void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // Derived class (child)
{
public void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // Derived class (child)
{
public void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
请记住,在继承章节中,我们使用 :
符号从一个类继承。
现在我们可以创建 Pig
和 Dog
对象,并在两者上调用 animalSound()
方法。
示例
class Animal // Base class (parent)
{
public void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // Derived class (child)
{
public void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // Derived class (child)
{
public void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal(); // Create a Animal object
Animal myPig = new Pig(); // Create a Pig object
Animal myDog = new Dog(); // Create a Dog object
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
输出将是
动物发出声音
动物发出声音
动物发出声音
这不是我想要的输出
上面示例的输出可能不是您预期的。这是因为当基类方法和派生类方法具有相同的名称时,基类方法会覆盖派生类方法。
但是,C# 提供了一个覆盖基类方法的选项,方法是在基类内部的方法中添加 virtual
关键字,并在每个派生类方法中使用 override
关键字。
示例
class Animal // Base class (parent)
{
public virtual void animalSound()
{
Console.WriteLine("The animal makes a sound");
}
}
class Pig : Animal // Derived class (child)
{
public override void animalSound()
{
Console.WriteLine("The pig says: wee wee");
}
}
class Dog : Animal // Derived class (child)
{
public override void animalSound()
{
Console.WriteLine("The dog says: bow wow");
}
}
class Program
{
static void Main(string[] args)
{
Animal myAnimal = new Animal(); // Create a Animal object
Animal myPig = new Pig(); // Create a Pig object
Animal myDog = new Dog(); // Create a Dog object
myAnimal.animalSound();
myPig.animalSound();
myDog.animalSound();
}
}
输出将是
动物发出声音
猪说: wee wee
狗说: bow wow
为什么要以及何时使用“继承”和“多态”?
- 它对于代码重用很有用:在创建新类时重用现有类的字段和方法。