VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > 数据结构 >
  • 继承:代码复用与扩展

继承:代码复用与扩展

  1. 继承的定义与核心价值
    继承是面向对象编程(OOP)三大特性之一,通过子类(派生类)继承父类(基类)的方式,实现代码复用(复用父类已有成员)和功能扩展(新增子类特有成员)。
    核心价值:
    减少重复代码,提高开发效率;
    增强代码可维护性(修改父类即可影响所有子类);
    支持多态(后续章节详解)。
  2. 继承的基本语法
    C#中通过冒号(:)实现继承,子类自动获得父类的非私vb.net教程C#教程python教程SQL教程access 2010教程
    有成员(字段、属性、方法等)。
    语法格式
    csharp
	// 父类(基类)
	public class ParentClass
	{
	// 父类成员(非private)
	}
	
	// 子类(派生类)
	public class ChildClass : ParentClass
	{
	// 子类新增成员
	}
  1. 继承的核心特点
    1.单继承限制:C#仅支持单继承(子类只能继承一个父类),但可通过接口实现多行为契约;
    2.成员继承规则:子类继承父类的public/protected/internal成员,private成员不可直接访问;
    3.构造函数继承:子类构造函数默认调用父类无参构造函数,如需调用父类带参构造,需显式使用base关键字;
    4.方法重写:子类可通过override关键字重写父类的virtual/abstract方法(实现多态)。
  2. 实例:动物类的继承与扩展
    以下实例通过父类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构造函数:咪咪(橘色)
	咪咪正在进食
	咪咪喜欢吃鱼
	咪咪(橘色)喵喵叫
  1. 基础知识拓展
    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


相关教程