当前位置: 首页 > article >正文

C# 继承与多态详解


.NET学习资料

.NET学习资料

.NET学习资料


在 C# 面向对象编程中,继承与多态是两个极为关键的特性,它们赋予了程序强大的复用性和灵活性。理解并掌握这两个特性,是成为一名优秀 C# 开发者的必经之路。

一、C# 继承

1.1 继承的定义与概念

继承是指一个新类(子类或派生类)可以获取另一个已存在类(父类或基类)的属性和方法。在 C# 中,使用冒号:来表示继承关系。例如:

class Animal
{
    public string Name { get; set; }
    public void Eat()
    {
        Console.WriteLine($"{Name}正在吃东西");
    }
}

class Dog : Animal
{
    public void Bark()
    {
        Console.WriteLine($"{Name}在汪汪叫");
    }
}

在上述代码中,Dog类继承自Animal类,这意味着Dog类自动拥有了Animal类的Name属性和Eat方法,同时还可以定义自己特有的Bark方法。

1.2 继承的特性

成员继承:子类会继承父类的公共(public)和受保护(protected)成员,但构造函数和析构函数不会被继承。其中,public成员可以被任何对象访问;protected成员只能被该类本身及其子类对象访问。

构造函数调用顺序:当创建子类对象时,系统会首先调用父类的构造函数,然后再调用子类的构造函数。如果子类构造函数需要调用父类的特定构造函数,可以使用base关键字。例如:

class Animal
{
    public Animal()
    {
        Console.WriteLine("Animal的构造函数被调用");
    }
}

class Dog : Animal
{
    public Dog() : base()
    {
        Console.WriteLine("Dog的构造函数被调用");
    }
}

执行new Dog();时,会先输出 “Animal 的构造函数被调用”,再输出 “Dog 的构造函数被调用” 。

使用base关键字:在子类中,base关键字用于访问父类的成员。当子类需要调用父类中被重写的方法,或者访问父类的属性时,就可以使用base关键字。例如:

class Animal
{
    public virtual void Move()
    {
        Console.WriteLine("动物在移动");
    }
}

class Dog : Animal
{
    public override void Move()
    {
        base.Move();// 调用父类的Move方法
        Console.WriteLine("狗在奔跑");
    }
}

1.3 方法重写(override)

方法重写是指在子类中重新定义父类中已有的虚方法(使用virtual关键字声明的方法)。重写后的方法需要使用override关键字声明,并且方法签名(方法名、参数列表和返回类型)必须与父类中的虚方法一致。例如:

class Shape
{
    public virtual void Draw()
    {
        Console.WriteLine("绘制一个形状");
    }
}

class Circle : Shape
{
    public override void Draw()
    {
        Console.WriteLine("绘制一个圆形");
    }
}

在这个例子中,Circle类重写了Shape类的Draw方法,当调用Circle对象的Draw方法时,会执行Circle类中重写后的方法。

1.4 继承的优点

代码复用:通过继承,子类可以复用父类的代码,减少重复代码的编写,提高开发效率。例如多个具有相似属性和行为的类,可以提取共同部分到父类,子类只需继承并扩展自己特有的部分。

增强代码的可维护性:当需要修改某个功能时,只需在父类中进行修改,所有子类都会受到影响,而不需要逐个修改每个子类的代码。

体现层次结构关系:清晰地展示了类之间的层次结构,使代码结构更加清晰,易于理解和扩展。

二、C# 多态

2.1 多态的定义与概念

多态是指同一个行为具有多个不同表现形式或形态的能力。在 C# 中,多态主要通过虚方法和抽象类来实现。简单来说,就是可以使用父类的引用来调用子类中重写的方法,在运行时根据对象的实际类型来决定调用哪个类的方法。例如:

class Animal
{
    public virtual void MakeSound()
    {
        Console.WriteLine("动物发出声音");
    }
}

class Dog : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("汪汪汪");
    }
}

class Cat : Animal
{
    public override void MakeSound()
    {
        Console.WriteLine("喵喵喵");
    }
}

class Program
{
    static void Main()
    {
        Animal animal1 = new Dog();
        Animal animal2 = new Cat();

        animal1.MakeSound();// 调用Dog类的MakeSound方法
        animal2.MakeSound();// 调用Cat类的MakeSound方法
    }
}

在上述代码中,animal1和animal2虽然都是Animal类型的引用,但它们分别指向Dog和Cat对象,在调用MakeSound方法时,会根据对象的实际类型调用相应子类的方法,这就是多态的体现。

2.2 实现多态的要素

子类重写父类方法:子类必须重写父类中使用virtual关键字声明的虚方法,并且使用override关键字进行声明。

向上转型:将子类对象赋值给父类引用,即使用父类的类型来引用子类对象。例如Animal animal = new Dog(); ,这里将Dog对象赋值给Animal类型的变量animal ,这就是向上转型。

2.3 多态的优点

提高代码的可扩展性:当需要添加新的子类时,不需要修改大量现有的代码,只需要在新子类中重写相应的方法即可。例如在上述动物的例子中,如果要添加一个Pig类,只需要让Pig类继承自Animal类,并重写MakeSound方法,而不需要修改其他类的代码。

增强代码的可维护性:多态使得代码结构更加清晰,每个类只负责自己的功能实现,通过父类引用来调用不同子类的方法,减少了代码的耦合度,便于维护和修改。

提高代码的复用性:可以编写通用的代码,通过父类引用来处理不同子类的对象,实现代码的复用。例如可以编写一个方法,接收Animal类型的参数,然后在方法中调用MakeSound方法,这样这个方法就可以处理任何继承自Animal的子类对象。

三、总结

继承与多态是 C# 面向对象编程中非常重要的特性。继承允许我们复用已有的代码,构建清晰的类层次结构;多态则通过动态绑定,使程序在运行时能够根据对象的实际类型做出不同的行为,提高了代码的灵活性、可扩展性和可维护性。在实际的 C# 开发中,合理运用继承与多态,可以让我们的代码更加简洁、高效和易于维护。随着对 C# 学习的深入,还可以进一步探索抽象类、接口等与继承和多态相关的特性,以更好地发挥面向对象编程的优势 。


http://www.kler.cn/a/530256.html

相关文章:

  • 年化18%-39.3%的策略集 | backtrader通过xtquant连接qmt实战
  • 安卓(android)实现注册界面【Android移动开发基础案例教程(第2版)黑马程序员】
  • 一种非接触式智能垃圾桶设计(论文+源码+实物)
  • HTML5 技术深度解读:本地存储与地理定位的最佳实践
  • 【llm对话系统】大模型 Llama 源码分析之归一化方法 RMS Norm
  • 9 点结构模块(point.rs)
  • 新到手路由器宽带上网设置八步法
  • 2025.2.1——八、Web_php_wrong_nginx_config
  • 【大模型专栏—基础篇】智能体入门
  • TypeScript语言的语法糖
  • 硕成C语言3
  • 基于Java的林业盗砍盗伐监测算法研究与实现——读取Shp文件并比较
  • 韩语字符分析
  • 你需要更深层次的解放
  • 队列—学习
  • 基于RAG的知识库问答系统
  • DedeBIZ资源系统源码 高仿XDGAME模板源码
  • 流处理 CompletableFuture
  • 马铃薯叶子病害检测数据集VOC+YOLO格式1332张9类别
  • 基于SpringBoot的青年公寓服务平台的设计与实现(源码+SQL脚本+LW+部署讲解等)
  • Flutter Raw Image Provider
  • Python 中 `finally` 的执行时机与 `return` 的微妙关系
  • SD存储卡功能特性解析
  • 【C++语言】卡码网语言基础课系列----11. 句子缩写
  • DeepSeek让英伟达狂跌三年?
  • openEuler系统磁盘管理方法