计算机系统应用教程网站

网站首页 > 技术文章 正文

3.3 C#的继承和多态

btikc 2025-01-16 18:09:56 技术文章 11 ℃ 0 评论

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# 的继承和多态的概念和用法,以及相关的关键字和规则。继承和多态是面向对象编程的核心特性,它们可以提高代码的复用性、灵活性和可读性。希望本文对你有所帮助。

Tags:

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表