💡 C# 向上转型与向下转型
很多人初学 C# 时,对“向上转型”和“向下转型”感到困惑。
它们其实是 继承与多态机制的核心。
这篇文章带你三分钟彻底搞懂。
🧱 一、继承关系示例
class Animal
{
public void Eat() => Console.WriteLine("Animal is eating");
}
class Dog : Animal
{
public void Bark() => Console.WriteLine("Dog is barking");
}Dog 继承自 Animal,说明 Dog 是一种 Animal。
接下来就能理解转型的意义。
🧩 二、向上转型(Upcasting)
向上转型:子类 → 父类。 例如:
Dog dog = new Dog();
Animal animal = dog; // 向上转型
animal.Eat(); // ✅ OK
// animal.Bark(); ❌ 不行- 向上转型是 自动转换,无需强制。
- 安全可靠,因为子类一定包含父类的所有成员。
👉 作用:屏蔽子类细节,让代码更通用。 这是实现 多态 的基础。
🔄 三、向下转型(Downcasting)
向下转型:父类 → 子类。 例如:
Animal animal = new Dog();
Dog dog = (Dog)animal; // 向下转型
dog.Bark(); // ✅ OK但要小心:
Animal animal = new Animal();
Dog dog = (Dog)animal; // ❌ InvalidCastException向下转型是 强制转换,如果类型不匹配,会抛出异常。 所以要 谨慎使用。
✅ 四、安全的转型方式
C# 提供了更安全的写法:
✔ 1. is 模式匹配
if (animal is Dog d)
{
d.Bark();
}✔ 2. as 安全转换
Dog? d = animal as Dog;
if (d != null)
{
d.Bark();
}这两种方式都能避免运行时崩溃。
⚙️ 五、多态的意义
如果父类方法被声明为 virtual,
子类可以 override 重新定义。
即使向上转型,也能调用子类实现:
class Animal
{
public virtual void Eat() => Console.WriteLine("Animal Eat");
}
class Dog : Animal
{
public override void Eat() => Console.WriteLine("Dog Eat");
}
Animal a = new Dog();
a.Eat(); // 输出:Dog Eat👉 这就是运行时多态的真正含义。
🧭 六、总结表格
| 类型 | 含义 | 安全性 | 是否自动 |
|---|---|---|---|
| 向上转型 | 子类 → 父类 | ✅ 安全 | ✅ 自动 |
| 向下转型 | 父类 → 子类 | ⚠️ 有风险 | ❌ 需强制 |
一句话总结:向上安全,向下小心。
💬 结语
理解向上转型和向下转型, 你就掌握了 C# 面向对象编程的核心逻辑。
👉 关注我,获取全部在线文档。
最后更新于