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

请记住,在继承一章中,我们使用:符号从类继承。

现在我们可以创建PigDog对象,并对它们调用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

运行实例 »

为什么使用"继承"和"多态"?

它对代码的可重用性很有用:在创建新类时重用现有类的字段和方法。