软件工程:继承
📌目录

⚖️ 继承:代码重用的核心机制
继承(Inheritance)是面向对象技术的核心机制之一,它允许子类继承父类的属性和方法,实现代码重用。本文将详细介绍继承的概念、类型、语法、方法重写以及设计原则。

🎯 一、继承概述
(一)继承的定义
继承是面向对象技术的一种机制,允许子类继承父类的属性和方法,实现代码重用和扩展。
继承概念:
(二)继承的本质
继承本质:
继承是一种"is-a"关系,子类是父类的一种特殊类型。
继承本质:
(三)继承的特点
继承特点:
| 特点 | 说明 |
|---|---|
| 代码重用 | 复用父类代码 |
| 扩展性 | 子类可以扩展 |
| 多态性 | 支持多态机制 |
| 层次性 | 形成类层次结构 |
📦 二、继承的类型
(一)继承类型概览
继承类型:
(二)单继承
单继承:子类只有一个父类。
单继承示例:
# 父类
class Animal:
def __init__(self, name, age):
self.name = name
self.age = age
def eat(self):
print(f"{self.name}在吃东西")
def sleep(self):
print(f"{self.name}在睡觉")
# 子类(单继承)
class Dog(Animal):
def __init__(self, name, age, breed):
super().__init__(name, age) # 调用父类构造函数
self.breed = breed
def bark(self):
print(f"{self.name}在叫")
# 使用
dog = Dog("旺财", 3, "金毛")
dog.eat() # 继承自父类:旺财在吃东西
dog.sleep() # 继承自父类:旺财在睡觉
dog.bark() # 子类特有:旺财在叫
(三)多继承
多继承:子类有多个父类。
多继承示例:
# 父类1
class Flyable:
def fly(self):
print("我能飞")
# 父类2
class Swimmable:
def swim(self):
print("我能游泳")
# 子类(多继承)
class Duck(Flyable, Swimmable):
def __init__(self, name):
self.name = name
def quack(self):
print(f"{self.name}在嘎嘎叫")
# 使用
duck = Duck("唐老鸭")
duck.fly() # 继承自Flyable:我能飞
duck.swim() # 继承自Swimmable:我能游泳
duck.quack() # 子类特有:唐老鸭在嘎嘎叫
(四)多层继承
多层继承:继承链,A继承B,B继承C。
多层继承示例:
# 祖父类
class Vehicle:
def __init__(self, brand):
self.brand = brand
def start(self):
print(f"{self.brand}启动")
# 父类
class Car(Vehicle):
def __init__(self, brand, model):
super().__init__(brand)
self.model = model
def drive(self):
print(f"{self.brand} {self.model}在行驶")
# 子类
class ElectricCar(Car):
def __init__(self, brand, model, battery):
super().__init__(brand, model)
self.battery = battery
def charge(self):
print(f"{self.brand} {self.model}在充电")
# 使用
car = ElectricCar("特斯拉", "Model 3", 75)
car.start() # 继承自Vehicle:特斯拉启动
car.drive() # 继承自Car:特斯拉 Model 3在行驶
car.charge() # 子类特有:特斯拉 Model 3在充电
(五)层次继承
层次继承:树形结构,一个父类有多个子类。
层次继承示例:
# 父类
class Shape:
def __init__(self, name):
self.name = name
def area(self):
pass
def display(self):
print(f"{self.name}的面积是:{self.area()}")
# 子类1
class Circle(Shape):
def __init__(self, radius):
super().__init__("圆形")
self.radius = radius
def area(self):
return 3.14 * self.radius ** 2
# 子类2
class Rectangle(Shape):
def __init__(self, width, height):
super().__init__("矩形")
self.width = width
self.height = height
def area(self):
return self.width * self.height
# 子类3
class Triangle(Shape):
def __init__(self, base, height):
super().__init__("三角形")
self.base = base
self.height = height
def area(self):
return 0.5 * self.base * self.height
# 使用
shapes = [
Circle(5),
Rectangle(4, 6),
Triangle(3, 4)
]
for shape in shapes:
shape.display()
# 输出:
# 圆形的面积是:78.5
# 矩形的面积是:24
# 三角形的面积是:6.0
🌐 三、继承的语法
(一)基本语法
基本语法:
class 父类名:
# 父类定义
pass
class 子类名(父类名):
# 子类定义
pass
基本语法示例:
# 父类
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def introduce(self):
return f"我是{self.name},{self.age}岁"
# 子类
class Student(Person):
def __init__(self, name, age, student_id):
super().__init__(name, age)
self.student_id = student_id
def study(self):
return f"{self.name}在学习"
# 使用
student = Student("张三", 20, "2024001")
print(student.introduce()) # 我是张三,20岁
print(student.study()) # 张三在学习
(二)super()函数
super()函数:调用父类的方法。
super()示例:
class Parent:
def __init__(self, name):
self.name = name
print(f"Parent构造函数:{name}")
def greet(self):
print(f"Parent问候:{self.name}")
class Child(Parent):
def __init__(self, name, age):
super().__init__(name) # 调用父类构造函数
self.age = age
print(f"Child构造函数:{age}岁")
def greet(self):
super().greet() # 调用父类方法
print(f"Child问候:{self.name}, {self.age}岁")
# 使用
child = Child("张三", 10)
# 输出:
# Parent构造函数:张三
# Child构造函数:10岁
child.greet()
# 输出:
# Parent问候:张三
# Child问候:张三, 10岁
(三)方法重写
方法重写:子类重新定义父类的方法。
方法重写示例:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return f"{self.name}在叫"
class Dog(Animal):
def speak(self): # 方法重写
return f"{self.name}在汪汪叫"
class Cat(Animal):
def speak(self): # 方法重写
return f"{self.name}在喵喵叫"
# 使用
dog = Dog("旺财")
cat = Cat("咪咪")
print(dog.speak()) # 旺财在汪汪叫
print(cat.speak()) # 咪咪在喵喵叫
(四)方法扩展
方法扩展:子类在父类方法基础上添加新功能。
方法扩展示例:
class Calculator:
def add(self, a, b):
return a + b
def subtract(self, a, b):
return a - b
class AdvancedCalculator(Calculator):
# 扩展:添加乘法
def multiply(self, a, b):
return a * b
# 扩展:添加除法
def divide(self, a, b):
if b == 0:
return "错误:除数不能为0"
return a / b
# 扩展:重写加法,添加日志
def add(self, a, b):
result = super().add(a, b) # 调用父类方法
print(f"计算:{a} + {b} = {result}")
return result
# 使用
calc = AdvancedCalculator()
print(calc.add(10, 5)) # 计算:10 + 5 = 15,输出:15
print(calc.multiply(10, 5)) # 输出:50
print(calc.divide(10, 5)) # 输出:2.0
💡 四、继承的应用
(一)应用背景
项目:员工管理系统
类设计:
- Employee类:员工基类
- Manager类:经理类
- Developer类:开发类
- Designer类:设计类
(二)类设计
Employee类(基类):
class Employee:
# 类属性
company = "科技公司"
count = 0
def __init__(self, emp_id, name, department, salary):
# 实例属性
self.emp_id = emp_id
self.name = name
self.department = department
self.salary = salary
Employee.count += 1
# 实例方法
def get_info(self):
"""获取信息"""
return f"{self.name}, {self.department}, 薪资:{self.salary}"
def work(self):
"""工作"""
return f"{self.name}在工作"
def get_bonus(self):
"""获取奖金"""
return self.salary * 0.1
# 类方法
@classmethod
def get_count(cls):
"""获取员工总数"""
return cls.count
# 静态方法
@staticmethod
def is_valid_id(emp_id):
"""验证工号"""
return len(emp_id) == 6
Manager类(子类):
class Manager(Employee):
def __init__(self, emp_id, name, department, salary, level):
super().__init__(emp_id, name, department, salary)
self.level = level
self.team = []
def add_team_member(self, employee):
"""添加团队成员"""
self.team.append(employee)
def work(self):
"""重写工作方法"""
return f"{self.name}在管理团队"
def get_bonus(self):
"""重写奖金方法"""
base_bonus = super().get_bonus()
level_bonus = self.level * 1000
return base_bonus + level_bonus
def get_info(self):
"""重写信息方法"""
base_info = super().get_info()
return f"{base_info}, 级别:{self.level}, 团队:{len(self.team)}人"
Developer类(子类):
class Developer(Employee):
def __init__(self, emp_id, name, department, salary, language):
super().__init__(emp_id, name, department, salary)
self.language = language
self.projects = []
def add_project(self, project):
"""添加项目"""
self.projects.append(project)
def work(self):
"""重写工作方法"""
return f"{self.name}在用{self.language}编程"
def get_bonus(self):
"""重写奖金方法"""
base_bonus = super().get_bonus()
project_bonus = len(self.projects) * 500
return base_bonus + project_bonus
def get_info(self):
"""重写信息方法"""
base_info = super().get_info()
return f"{base_info}, 语言:{self.language}, 项目:{len(self.projects)}个"
Designer类(子类):
class Designer(Employee):
def __init__(self, emp_id, name, department, salary, tool):
super().__init__(emp_id, name, department, salary)
self.tool = tool
self.designs = []
def add_design(self, design):
"""添加设计"""
self.designs.append(design)
def work(self):
"""重写工作方法"""
return f"{self.name}在用{self.tool}设计"
def get_bonus(self):
"""重写奖金方法"""
base_bonus = super().get_bonus()
design_bonus = len(self.designs) * 300
return base_bonus + design_bonus
def get_info(self):
"""重写信息方法"""
base_info = super().get_info()
return f"{base_info}, 工具:{self.tool}, 设计:{len(self.designs)}个"
(三)实例使用
实例使用示例:
# 创建员工
manager = Manager("E001", "张三", "技术部", 20000, 3)
developer1 = Developer("E002", "李四", "技术部", 15000, "Python")
developer2 = Developer("E003", "王五", "技术部", 15000, "Java")
designer = Designer("E004", "赵六", "设计部", 12000, "Photoshop")
# 添加团队成员
manager.add_team_member(developer1)
manager.add_team_member(developer2)
# 添加项目和设计
developer1.add_project("项目A")
developer1.add_project("项目B")
developer2.add_project("项目C")
designer.add_design("设计1")
designer.add_design("设计2")
designer.add_design("设计3")
# 查看信息
print(manager.get_info())
# 张三, 技术部, 薪资:20000, 级别:3, 团队:2人
print(developer1.get_info())
# 李四, 技术部, 薪资:15000, 语言:Python, 项目:2个
print(designer.get_info())
# 赵六, 设计部, 薪资:12000, 工具:Photoshop, 设计:3个
# 查看工作
print(manager.work()) # 张三在管理团队
print(developer1.work()) # 李四在用Python编程
print(designer.work()) # 赵六在用Photoshop设计
# 查看奖金
print(f"经理奖金:{manager.get_bonus()}") # 经理奖金:5000.0
print(f"开发奖金:{developer1.get_bonus()}") # 开发奖金:2500.0
print(f"设计奖金:{designer.get_bonus()}") # 设计奖金:2100.0
# 查看统计
print(f"员工总数:{Employee.get_count()}") # 员工总数:4
print(f"工号验证:{Employee.is_valid_id('E001')}") # 工号验证:True
📊 五、继承的优缺点
(一)优点
优点:
| 优点 | 说明 |
|---|---|
| 代码重用 | 复用父类代码 |
| 扩展性 | 子类可以扩展功能 |
| 多态性 | 支持多态机制 |
| 可维护性 | 代码结构清晰 |
(二)缺点
缺点:
| 缺点 | 说明 |
|---|---|
| 耦合性 | 子类依赖父类 |
| 复杂性 | 继承层次过深 |
| 脆弱性 | 父类修改影响子类 |
| 多继承问题 | 菱形继承问题 |
(三)适用场景
适用场景:
| 场景 | 说明 |
|---|---|
| is-a关系 | 子类是父类的一种 |
| 代码重用 | 需要复用代码 |
| 扩展功能 | 需要扩展功能 |
| 多态实现 | 需要多态机制 |
📋 六、继承的设计原则
(一)里氏替换原则
里氏替换原则:子类应该能够替换父类。
示例:
# 遵循里氏替换原则
class Shape:
def area(self):
pass
class Rectangle(Shape):
def __init__(self, width, height):
self.width = width
self.height = height
def area(self):
return self.width * self.height
class Square(Shape):
def __init__(self, side):
self.side = side
def area(self):
return self.side ** 2
# 子类可以替换父类
def print_area(shape):
print(f"面积:{shape.area()}")
print_area(Rectangle(4, 6)) # 面积:24
print_area(Square(5)) # 面积:25
(二)组合优于继承
组合优于继承:优先使用组合而非继承。
示例:
# 使用继承(不推荐)
class Animal:
def eat(self):
print("吃东西")
class Dog(Animal):
def bark(self):
print("汪汪叫")
# 使用组合(推荐)
class Animal:
def eat(self):
print("吃东西")
class Dog:
def __init__(self):
self.animal = Animal() # 组合
def eat(self):
self.animal.eat()
def bark(self):
print("汪汪叫")
(三)避免过深的继承层次
避免过深的继承层次:继承层次不宜过深。
示例:
# 继承层次过深(不推荐)
class A:
pass
class B(A):
pass
class C(B):
pass
class D(C):
pass
class E(D):
pass
# 继承层次适中(推荐)
class Base:
pass
class Middle(Base):
pass
class Derived(Middle):
pass
📝 总结
继承是面向对象技术的核心机制。
🎯 继承定义:继承是面向对象技术的一种机制,允许子类继承父类的属性和方法,实现代码重用和扩展。
📦 继承类型:
- 单继承:子类只有一个父类
- 多继承:子类有多个父类
- 多层继承:继承链,A继承B,B继承C
- 层次继承:树形结构,一个父类有多个子类
💡 继承语法:
- 基本语法:class 子类名(父类名)
- super()函数:调用父类的方法
- 方法重写:子类重新定义父类的方法
- 方法扩展:子类在父类方法基础上添加新功能
📊 继承优缺点:
- 优点:代码重用、扩展性、多态性、可维护性
- 缺点:耦合性、复杂性、脆弱性、多继承问题
📋 继承设计原则:
- 里氏替换原则:子类应该能够替换父类
- 组合优于继承:优先使用组合而非继承
- 避免过深的继承层次:继承层次不宜过深
核心启示:继承是面向对象技术的核心机制,通过继承可以实现代码重用和扩展。理解继承的概念和类型,掌握继承的语法和应用,是掌握面向对象技术的关键。在实际工作中,我们需要注意:第一,深入理解继承的概念和本质(is-a关系);第二,掌握继承的类型(单继承、多继承、多层继承、层次继承);第三,熟练使用继承的语法(super()、方法重写、方法扩展);第四,遵循继承的设计原则(里氏替换原则、组合优于继承、避免过深继承);第五,合理使用继承,避免过度继承和耦合。继承不仅是代码重用的手段,更是我们理解和建模现实世界的重要工具。通过合理的继承设计,我们可以构建出结构清晰、易于扩展的软件系统。记住:好的继承设计是代码重用的关键。
更多推荐
所有评论(0)