C# Academy · 课时

多态与动态分派

理解多态:通过基类引用调用虚成员,使用基类类型的集合,避免方法隐藏,并在需要时安全地进行类型转换。

第 3 / 3 课8 个步骤

多态与动态分派 是 CoddyKit 上的免费 C# Academy 课时。 这是第 3 节课,共 3 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 C# Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 C# Academy 课程共包含 3 节课。

多态概览

目标:使用一个基类型,并让派生类型定制行为。

  • 基类 reference,派生对象
  • virtual + override → 动态分派
  • 基类型集合
  • 避免使用 new 隐藏方法

动态分派基础

调用 virtual 方法时,使用对象的运行时类型,而不是变量的编译时类型。

using System;

public class Animal
{
  public virtual string Speak() { return "???"; }
}

public class Cat : Animal
{
  public override string Speak() { return "Meow"; }
}

public class Dog : Animal
{
  public override string Speak() { return "Woof"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Animal a1 = new Cat(); // base reference
    Animal a2 = new Dog();
    Console.WriteLine(a1.Speak()); // Meow
    Console.WriteLine(a2.Speak()); // Woof
  }
}

集合中的多态

将不同的派生类型存储在 List<Base> 中,并以统一方式调用 virtual 成员。

using System;
using System.Collections.Generic;

public class Shape
{
  public virtual double Area() { return 0.0; }
}

public class Rectangle : Shape
{
  private readonly int _w, _h;
  public Rectangle(int w, int h) { _w = w; _h = h; }
  public override double Area() { return _w * _h; }
}

public class Circle : Shape
{
  private readonly int _r;
  public Circle(int r) { _r = r; }
  public override double Area() { return 3.14159 * _r * _r; }
}

public class Program
{
  public static void Main(string[] args)
  {
    List<Shape> shapes = new List<Shape>();
    shapes.Add(new Rectangle(3, 4));
    shapes.Add(new Circle(2));

    foreach (Shape s in shapes)
    {
      Console.WriteLine("Area = " + s.Area()); // calls correct override
    }
  }
}

隐藏与 override

避免方法隐藏(new)。使用 override 实现真正的多态;通过基类 reference 调用隐藏的方法时,会调用基类版本。

using System;

public class Printer
{
  public virtual void Print() { Console.WriteLine("[Base]"); }
}

public class LoudPrinter : Printer
{
  public override void Print() { Console.WriteLine("[LOUD]"); }
}

public class HiddenPrinter : Printer
{
  // Hides the base method instead of overriding (BAD fit for polymorphism)
  public new void Print() { Console.WriteLine("[HIDDEN]"); }
}

public class Program
{
  public static void Main(string[] args)
  {
    Printer a = new LoudPrinter();
    Printer b = new HiddenPrinter();

    a.Print(); // [LOUD]  (override works)
    b.Print(); // [Base]  (hiding fails via base reference)
  }
}

安全转换(as + 检查)

优先使用基类/virtual 调用。如果必须使用仅存在于派生类中的成员,请安全地进行转换(as + 空值检查)。

using System;

public class Vehicle
{
  public virtual string Info() { return "Vehicle"; }
}

public class Car : Vehicle
{
  public bool HasAirConditioning;
  public override string Info() { return "Car"; }
}

public class Program
{
  public static void Main(string[] args)
  {
    Vehicle v = new Car();
    Console.WriteLine(v.Info()); // polymorphic call

    // Need a Car-only member? Cast carefully using 'as'
    Car c = v as Car;
    if (c != null)
    {
      c.HasAirConditioning = true;
      Console.WriteLine("AC set: " + c.HasAirConditioning);
    }
    else
    {
      Console.WriteLine("Not a Car");
    }
  }
}

多态提示

提示:

  • 首先围绕基类/virtual 调用进行设计。
  • 使用 override,而不是 new,来改变行为。
  • 保持基类 APIs 小巧且稳定。
  • 少做类型转换;优先使用多态或接口。

动态分派的含义

快速检查:动态分派在 C# 中是什么意思?

回顾

回顾:多态通过 virtual/override,让一次基类调用可以触达多种派生行为。使用基类型集合,避免 new 隐藏,仅在必要时进行类型转换。

免费开始

用 AI 导师学习 C# — 免费

在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。

课程
93
课程
346

常见问题解答

「多态与动态分派」课时是免费的吗?

是的 — 「多态与动态分派」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 C# Academy 课程的其余内容,请升级到 CoddyKit PRO。 C# Academy 课程共包含 3 节课。

「多态与动态分派」这节课中我会学到什么?

理解多态:通过基类引用调用虚成员,使用基类类型的集合,避免方法隐藏,并在需要时安全地进行类型转换。 你通过在浏览器中直接运行的动手代码来练习 C# Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 C# Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 C# Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 3 节。

「多态与动态分派」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 C# Academy 课中编写并运行代码吗?

能。每节 C# Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. virtual/override/sealed 与抽象类
  2. 接口(入门)与多接口实现
  3. 多态与动态分派
← 返回 C# Academy