网站首页 > 技术文章 正文
C#的继承和多态
继承
继承是面向对象编程的一个重要特性,它允许一个类(子类)延续另一个类(父类)的特征(属性和方法),并且可以添加自己的个性化特征。继承的好处有:
- 代码复用,避免重复编写相同的代码
- 一处修改,处处更新,方便维护和扩展
- 实现多态,提高程序的灵活性和可读性
在 C# 中,使用 : 符号表示继承关系,例如:
public class Animal // 父类
{
// 父类的属性和方法
}
public class Cat : Animal // 子类
{
// 子类的属性和方法
}
在 C# 中,有以下几个特点和规则:
- 所有的类都隐式继承自 Object 类,这是所有类的基类
- 一个子类只能有一个父类,但一个父类可以有多个子类
- 继承具有传递性,如果 A 继承自 B,B 继承自 C,那么 A 就具有 B 和 C 的特征
- 子类可以访问父类的 public 和 protected 成员,但不能访问 private 成员
- 子类可以使用 base 关键字来调用父类的构造函数、属性或方法
- 子类可以使用 this 关键字来区分自己和父类的同名成员
- 父类可以使用 sealed 关键字来阻止被继承,例如 public sealed class Animal
- 子类可以使用 new 关键字来隐藏父类的非虚拟成员,例如 public new void Introduce()
多态
多态是指不同对象接收相同的消息时产生不同的行为。多态有两种实现方式:继承多态和接口多态。这里主要介绍继承多态。
继承多态是通过虚拟方法(virtual 方法)和重写方法(override 方法)来实现的。虚拟方法是在父类中声明并实现的方法,它可以被子类重写或直接使用。重写方法是在子类中对虚拟方法进行重新定义和实现的方法。
当子类重写了父类的虚拟方法时,即使将子类对象当作父类对象使用,也会调用子类的重写方法。这就实现了多态,即同一个方法在不同对象上表现出不同的行为。
以下是一个简单的例子:
public class Shape // 父类
{
public virtual void Draw() // 虚拟方法
{
Console.WriteLine("Performing base class drawing tasks");
}
}
public class Circle : Shape // 子类
{
public override void Draw() // 重写方法
{
Console.WriteLine("Drawing a circle");
base.Draw(); // 调用父类方法
}
}
public class Rectangle : Shape // 子类
{
public override void Draw() // 重写方法
{
Console.WriteLine("Drawing a rectangle");
base.Draw(); // 调用父类方法
}
}
// 测试代码
var shapes = new List<Shape> { new Circle(), new Rectangle() }; // 创建一个包含不同形状对象的列表
foreach (var shape in shapes) // 遍历列表中的每个对象
{
shape.Draw(); // 调用对象的重写方法
}
/* 输出结果:
Drawing a circle
Performing base class drawing tasks
Drawing a rectangle
Performing base class drawing tasks
*/
从上面的例子可以看出,虽然列表中的每个对象都是 Shape 类型,但是调用 Draw 方法时,会根据对象的实际类型(Circle 或 Rectangle)来执行相应的重写方法。这就是多态的效果。
在 C# 中,有以下几个特点和规则:
- 只有父类中声明为 virtual 或 abstract 的方法才能被子类重写
- 子类中重写方法必须使用 override 关键字显式指示该方法将参与虚调用
- 字段不能是虚拟的,只有方法、属性、事件和索引器才可以是虚拟的
- 子类可以使用 base 关键字来调用父类的虚拟方法,例如 base.Draw()
- 子类可以使用 new 关键字来隐藏父类的虚拟方法,例如 public new void Draw()
- 子类可以使用 sealed 关键字来阻止被进一步重写,例如 public sealed override void Draw()
总结
本文介绍了 C# 的继承和多态的概念和用法,以及相关的关键字和规则。继承和多态是面向对象编程的核心特性,它们可以提高代码的复用性、灵活性和可读性。希望本文对你有所帮助。
- 上一篇: C# sealed 关键字
- 下一篇: C#多态方法总结
猜你喜欢
- 2025-01-16 C#13和 .NET9高级功能解析:.NET高手必备技能
- 2025-01-16 C#使用Autofac实现控制反转IoC和面向切面编程AOP
- 2025-01-16 C#设计模式(3)——工厂方法模式
- 2025-01-16 C# - 面向对象知识总结 082
- 2025-01-16 c#简单工厂、抽象工厂、反射
- 2025-01-16 C# 13 和 .NET 9 全知道 :9 处理文件、流和序列化 (1)
- 2025-01-16 Effective C++ 条款07 为多态基类声明virtual析构函数
- 2025-01-16 C# 数据结构和算法 :03 数组和排序(五)
- 2025-01-16 从零开始自学C#基础的最后一天——集合
- 2025-01-16 多态 C#
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- oraclesql优化 (66)
- 类的加载机制 (75)
- feignclient (62)
- 一致性hash算法 (71)
- dockfile (66)
- 锁机制 (57)
- javaresponse (60)
- 查看hive版本 (59)
- phpworkerman (57)
- spark算子 (58)
- vue双向绑定的原理 (68)
- springbootget请求 (58)
- docker网络三种模式 (67)
- spring控制反转 (71)
- data:image/jpeg (69)
- base64 (69)
- java分页 (64)
- kibanadocker (60)
- qabstracttablemodel (62)
- java生成pdf文件 (69)
- deletelater (62)
- com.aspose.words (58)
- android.mk (62)
- qopengl (73)
- epoch_millis (61)
本文暂时没有评论,来添加一个吧(●'◡'●)