类 - (下篇)
掌握继承的语法与特性
掌握方法重写与多态
熟练使用 base 关键字
理解访问修饰符的权限范围
核心讲解
(1)继承
子类继承父类的非私有成员,实现代码复用。C# 是单继承,一个类只能有一个父类。
关键字:
:所有类默认继承
object子类可以扩展自己的属性和方法
(2)访问修饰符
表格
修饰符 | 本类 | 同包 | 子类 | 外部 |
|---|---|---|---|---|
public | ✅ | ✅ | ✅ | ✅ |
protected | ✅ | ❌ | ✅ | ❌ |
internal | ✅ | ✅ | ❌ | ❌ |
private | ✅ | ❌ | ❌ | ❌ |
(3)方法重写
子类重新实现父类的方法,实现不同的行为。
父类方法加
virtual子类方法加
override签名必须完全一致
重写后,父类引用指向子类对象,调用的是子类的方法 → 多态
(4)base 关键字
代表父类对象:
调用父类的属性 / 方法
调用父类的构造函数,必须在子类构造第一行
操作步骤
定义父类 Animal,子类 Cat、Dog
重写方法,实现多态
测试 base 调用父类成员
运行验证
代码示例
// 父类
public class Animal
{
public string Name { get; set; }
public Animal(string name)
{
Name = name;
}
public virtual void Shout()
{
Console.WriteLine(Name + "发出叫声");
}
public void Eat()
{
Console.WriteLine(Name + "在吃东西");
}
}
// 子类:猫
public class Cat : Animal
{
// 调用父类构造
public Cat(string name) : base(name)
{
}
// 重写叫的方法
public override void Shout()
{
Console.WriteLine(Name + ":喵喵喵~");
}
// 子类特有方法
public void CatchMouse()
{
Console.WriteLine(Name + "抓老鼠");
}
}
// 子类:狗
public class Dog : Animal
{
public Dog(string name) : base(name)
{
}
public override void Shout()
{
Console.WriteLine(Name + ":汪汪汪!");
}
}
// Program.cs
// 多态:父类引用指向子类对象
Animal a1 = new Cat("小花");
Animal a2 = new Dog("大黄");
a1.Eat(); // 继承父类的方法
a1.Shout(); // 调用子类重写的方法
a2.Eat();
a2.Shout();
// 向下转型,调用子类特有方法
Cat cat = (Cat)a1;
cat.CatchMouse();
Console.ReadKey();
常见误区
继承私有成员:子类不能继承父类的 private 成员,只能通过 public/protected 方法访问
重写改方法名 / 参数:签名必须和父类完全一样,不然就是新方法不是重写
base () 随便放:base 调用父类构造必须在子类构造的第一行
向下转型强转失败:类型不匹配会抛异常,转型前先判断
is
课后练习
定义形状抽象基类 Shape,有 name 属性和求面积的虚方法
子类 Circle、Rectangle,重写求面积方法
用多态创建不同形状对象,调用求面积
思考:封装、继承、多态三大特性各自的作用是什么?
