-
继承:代码复用与扩展
继承:代码复用与扩展
-
继承的定义与核心价值
继承是面向对象编程(OOP)三大特性之一,通过子类(派生类)继承父类(基类)的方式,实现代码复用(复用父类已有成员)和功能扩展(新增子类特有成员)。
核心价值:
减少重复代码,提高开发效率;
增强代码可维护性(修改父类即可影响所有子类);
支持多态(后续章节详解)。 -
继承的基本语法
C#中通过冒号(:)实现继承,子类自动获得父类的非私vb.net教程C#教程python教程SQL教程access 2010教程
有成员(字段、属性、方法等)。
语法格式
csharp
// 父类(基类)
public class ParentClass
{
// 父类成员(非private)
}
// 子类(派生类)
public class ChildClass : ParentClass
{
// 子类新增成员
}
-
继承的核心特点
1.单继承限制:C#仅支持单继承(子类只能继承一个父类),但可通过接口实现多行为契约;
2.成员继承规则:子类继承父类的public/protected/internal成员,private成员不可直接访问;
3.构造函数继承:子类构造函数默认调用父类无参构造函数,如需调用父类带参构造,需显式使用base关键字;
4.方法重写:子类可通过override关键字重写父类的virtual/abstract方法(实现多态)。 -
实例:动物类的继承与扩展
以下实例通过父类Animal和子类Dog/Cat,展示继承的复用与扩展能力。
4.1 父类定义(Animal)
csharp
public class Animal
{
// 父类公共属性(子类可直接使用)
public string Name { get; set; }
public int Age { get; set; }
// 父类构造函数(初始化姓名和年龄)
public Animal(string name, int age)
{
Name = name;
Age = age;
Console.WriteLine($"Animal构造函数:{Name}({Age}岁)");
}
// 父类虚拟方法(允许子类重写)
public virtual void Eat()
{
Console.WriteLine($"{Name}正在进食");
}
}
逐行讲解:
public string Name { get; set; }:父类公共属性,子类可直接访问;
public Animal(string name, int age):父类带参构造函数,初始化核心属性;
public virtual void Eat():virtual关键字标记方法可被子类重写。
4.2 子类定义(Dog/Cat)
子类Dog(扩展品种与吠叫行为)
csharp
public class Dog : Animal
{
// 子类新增属性(特有成员)
public string Breed { get; set; }
// 子类构造函数:显式调用父类带参构造(base关键字)
public Dog(string name, int age, string breed) : base(name, age)
{
Breed = breed;
Console.WriteLine($"Dog构造函数:{Name}({Breed})");
}
// 子类新增方法(特有行为)
public void Bark()
{
Console.WriteLine($"{Name}({Breed})汪汪叫");
}
// 重写父类Eat方法(自定义进食行为)
public override void Eat()
{
base.Eat(); // 调用父类Eat方法(复用父类逻辑)
Console.WriteLine($"{Name}喜欢吃骨头");
}
}
子类Cat(扩展颜色与喵喵叫行为)
csharp
public class Cat : Animal
{
// 子类新增属性
public string Color { get; set; }
// 子类构造函数:调用父类带参构造
public Cat(string name, int age, string color) : base(name, age)
{
Color = color;
Console.WriteLine($"Cat构造函数:{Name}({Color})");
}
// 子类新增方法
public void Meow()
{
Console.WriteLine($"{Name}({Color})喵喵叫");
}
// 重写父类Eat方法
public override void Eat()
{
base.Eat();
Console.WriteLine($"{Name}喜欢吃鱼");
}
}
逐行讲解:
public class Dog : Animal:Dog继承Animal,自动获得Name/Age属性与Eat方法;
base(name, age):显式调用父类带参构造,初始化父类属性;
public override void Eat():重写父类虚拟方法,添加子类特有逻辑;
public void Bark():子类新增方法,扩展父类未有的行为。
4.3 实例运行与输出
csharp
class Program
{
static void Main(string[] args)
{
// 创建Dog实例
Dog myDog = new Dog("旺财", 3, "中华田园犬");
myDog.Eat(); // 调用重写的Eat方法
myDog.Bark(); // 调用子类新增方法
Console.WriteLine("-------------------");
// 创建Cat实例
Cat myCat = new Cat("咪咪", 2, "橘色");
myCat.Eat(); // 调用重写的Eat方法
myCat.Meow(); // 调用子类新增方法
}
}
输出结果:
Animal构造函数:旺财(3岁)
Dog构造函数:旺财(中华田园犬)
旺财正在进食
旺财喜欢吃骨头
旺财(中华田园犬)汪汪叫
-------------------
Animal构造函数:咪咪(2岁)
Cat构造函数:咪咪(橘色)
咪咪正在进食
咪咪喜欢吃鱼
咪咪(橘色)喵喵叫
-
基础知识拓展
5.1 方法重写vs方法隐藏
|类型|关键字|父类方法要求|运行时行为|
| ---- | ---- | ---- | ---- |
|重写|override|virtual/abstract|根据实例类型调用方法(多态)|
|隐藏 |new|无限制|根据引用类型调用方法|
实例:方法隐藏
csharp
public class Animal
{
public void Move() => Console.WriteLine("动物移动");
}
public class Dog : Animal
{
public new void Move() => Console.WriteLine("狗跑");
}
// 调用
Animal a = new Dog();
a.Move(); // 输出:动物移动(引用类型为Animal)
Dog d = new Dog();
d.Move(); // 输出:狗跑(引用类型为Dog)
5.2 base关键字的核心用法
调用父类构造函数:base(参数)在子类构造函数首行使用;
调用父类方法:base.Method()在子类方法中调用父类逻辑;
调用父类属性:base.Property访问父类属性。
5.3 密封类(sealed)
防止类被继承,用于保护核心类的逻辑不被修改:
csharp
sealed class Dog : Animal // Dog不能被继承
{
// ...
}
5.4 抽象类与抽象方法
抽象类(abstract):不能实例化,用于定义子类的通用模板;
抽象方法(abstract):无实现,必须被子类重写。
csharp
abstract class Animal
{
public abstract void Eat(); // 抽象方法(无实现)
}
public class Dog : Animal
{
public override void Eat() => Console.WriteLine("狗吃骨头"); // 必须重写
}
5.5 继承与接口的区别
特性 继承(类) 接口(Interface)
关系 is-a(是一种) can-do(能做什么)
数量限制 单继承 多实现
成员类型 字段、属性、方法(有实现) 仅方法/属性签名(无实现)
6. 总结
继承的核心是复用父类代码与扩展子类功能,是构建类层次结构的基础。正确使用继承需遵循is-a关系(如Dog是Animal的一种),避免过度继承导致类层次复杂。
下一章将深入讲解多态,进一步释放继承的威力。
练习:定义父类Vehicle(车辆),子类Car(汽车)和Bike(自行车),实现继承与扩展。
csharp
// 父类
public class Vehicle
{
public string Brand { get; set; }
public Vehicle(string brand) => Brand = brand;
public virtual void Run() => Console.WriteLine($"{Brand}行驶");
}
// 子类Car
public class Car : Vehicle
{
public int Doors { get; set; }
public Car(string brand, int doors) : base(brand) => Doors = doors;
public override void Run() => Console.WriteLine($"{Brand}汽车({Doors}门)高速行驶");
}
本章重点:
继承语法:子类:父类;
核心特性:单继承、成员继承、构造函数调用;
扩展技巧:override重写、base关键字、密封类/抽象类。
通过继承,你可以高效构建可复用、可扩展的代码体系,为后续的多态与设计模式打下基础。
本站原创,转载请注明出处:https://www.xin3721.com/python3/python49367.html










