C# 继承详解

继承是面向对象程序设计(OOP)中的核心概念之一,它极大地增强了代码的重用性、扩展性和维护性。本篇文章将详细讲解C#中的继承机制,包括基础概念、语法特法、多重继承(通过接口实现)、继承的规则和实际应用示例,帮助你全面理解和掌握C#的继承特性。


一、什么是继承?

继承允许你基于已有的类(称为基类或父类)定义另一个类(称为派生类或子类)。派生类继承了基类所有的成员(字段、方法、属性),可以直接使用,也可以重写(Override)以实现不同的行为,或者添加新成员。

敌说:
继承实现了**"属于"(IS-A)**关系。例如:

  • 狗(Dog)属于(IS-A)动物(Animal)
  • 哺乳动物(Mammal)属于(IS-A)动物
  • 宝马(BMW)属于(IS-A) 汽车(Car)

这种关系帮助我们模拟现实世界中的层次结构,简化设计。


二、C#中定义继承

1. 基本语法

在C#中,使用冒号(:)表示继承关系,派生类书写格式如下:

<访问修饰符> class <派生类名> : <基类名> {// 成员定义
}

注意事项:

  • 一个派生类只能直接继承一个基类(单继承)。
  • 一个基类可以拥有多个派生类(多重派生不可直接支持,但可以用接口模拟)。

2. 示例:定义基础类和派生类

using System;// 基类
class Animal {public void Eat() {Console.WriteLine("动物会吃东西");}
}// 派生类
class Dog: Animal {public void Bark() {Console.WriteLine("狗会叫");}
}class Program {static void Main() {Dog myDog = new Dog();myDog.Eat();   // 继承自AnimalmyDog.Bark();  // 自己的方法}
}

在这个例子中,Dog继承自Animal,无须在Dog中重新定义Eat()方法。


三、继承的细节与规则

1. 隐式继承

  • 派生类自动继承基类的公共(public)和受保护(protected)成员。
  • 私有(private)成员不被继承,但子类可以通过公共或受保护的方法访问。

2. 构造函数

  • 基类的构造函数在派生类实例化时自动调用。
  • 如果基类含有参数化构造函数,派生类必须在构造函数中显式调用base()

示例:

class Person {public string Name;public Person(string name) {Name = name;}
}class Student : Person {public int Grade;public Student(string name, int grade): base(name) {Grade = grade;}
}

 

3. 方法的重写

  • 父类中的方法必须声明为virtual,子类需要使用override关键字重写。
  • 这允许派生类根据需求定制行为。

示例:

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

4. 访问修饰符影响继承

  • public:无限制访问
  • protected:子类可以访问
  • private:不可被继承方访问,子类不可访问
  • internal:同程序集可访问
  • protected internal:保护和内部的结合

四、示例:继承实现“形状”和“矩形”

1. 定义基类Shape

using System;namespace InheritanceDemo {class Shape {protected int width, height;public void SetDimensions(int w, int h) {width = w;height = h;}public virtual int Area() {return 0; // 只是一个占位符}}class Rectangle : Shape {public override int Area() {return width * height;}}class Program {static void Main() {Rectangle rect = new Rectangle();rect.SetDimensions(10, 5);Console.WriteLine("矩形面积: " + rect.Area());}}
}

输出:

矩形面积: 50

这个例子展现了覆盖(重写)Area()方法,实现了多态性。


五、继承的扩展——多重继承(通过接口实现)

C#不支持多继承(一个类继承多个类),为了实现类似效果,推荐使用接口(interface)

1. 接口简介

接口定义了一组抽象方法和属性,但没有实现。类可以实现多个接口,实现多继承的效果。

2. 例子:用接口模拟多重继承

using System;public interface IShape {double Area();
}public interface IColor {string GetColor();
}class Circle : IShape, IColor {private double radius;public Circle(double r) {radius = r;}public double Area() {return Math.PI * radius * radius;}public string GetColor() {return "红色";}
}class Program {static void Main() {Circle c = new Circle(5);Console.WriteLine("面积: " + c.Area());Console.WriteLine("颜色: " + c.GetColor());}
}

输出:

面积: 78.5398163397448
颜色: 红色

这里,Circle实现了两个接口,达到了多重继承的效果。


六、继承中常见的应用技巧

  • 隐藏继承(隐藏基类成员):子类可以用new关键字隐藏继承的成员。
  • 调用基类成员:可以用base关键字访问基类成员,或调用基类构造函数。
  • 构造函数调用:派生类在构造函数中调用基类的构造函数。

示例:

class Base {public virtual void Method() {Console.WriteLine("Base方法");}
}class Derived : Base {public override void Method() {base.Method(); // 调用基类方法Console.WriteLine("派生类方法");}
}

七、总结

  • 继承是实现代码复用和模型表达的重要手段。
  • C#只支持单继承,但可用interface实现多继承。
  • 通过virtualoverride实现多态。
  • 使用继承时应合理设计“IS-A”关系,避免不合理的关系设定。

八、结语

掌握C#中的继承,是成为一名优秀面向对象开发者的必要条件。合理设计继承树,不仅可以提升开发效率,还能增强程序的扩展性和可维护性。希望本篇文章能为你提供系统、全面的理解,助你在实践中灵活应用。


祝你编程顺利!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/903466.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SQLAlchemy 2.x 异步查询方法比较

SQLAlchemy 2.x 异步查询中常用的 结果处理方法速查表&#xff0c;包含方法说明、使用场景、返回类型及典型用途。 SQLAlchemy 查询结果处理方法速查表&#xff08;适用于 AsyncSession&#xff09; 方法 说明 返回类型 示例 SQL 示例输出 scalars().all() 获取单列所有…

极客天成参与”AI助力智慧城市构建”主题演讲暨招商引智专题推介活动

4月7日下午&#xff0c;北京极客天成科技有限公司参加了天津市河东区数据局举办的“AI赋能智慧城市构建”主题演讲暨招商引智专题推介活动。 活动中&#xff0c;华为&#xff08;天津&#xff09;有限公司数字政府解决方案总监姜华庚围绕“政务大模型赋能智慧城市建设”&#x…

理解 EKS CloudWatch Pod CPU Utilization 指标:与 `kubectl top` 及节点 CPU 的关系

在使用 AWS EKS 时&#xff0c;CloudWatch Container Insights 提供了丰富的容器级别监控指标&#xff0c;帮助我们深入了解应用的运行状态。如下截图中的 ContainerInsights pod_cpu_utilization 指标就是一个非常重要的维度。本文将详细解释这个指标的含义&#xff0c;并将其…

使用pip3安装软件包报错`externally-managed-environment`的几种解决方式

1、pip3安装软件包报错 报错externally-managed-environment的原因&#xff1a; 从 Python 3.11 开始引入了 PEP 668 规范&#xff0c;该规范限制了在系统级 Python 环境中使用 pip 安装第三方包&#xff0c;以避免与系统包管理器&#xff08;如 apt&#xff09;产生冲突。 如…

spring security用户退出

Spring security默认实现了用户退出的功能&#xff0c;用户退出主要考虑退出后会话如何管理以及跳转到哪个页面。HttpSecurity类提供了logout()方法开启退出登录的支持&#xff0c;默认触发用户退出操作的URL为“/logout”&#xff0c;用户退出时同时也会清除Session等默认用户…

爱普生SG2520HHN晶振数据中心服务器的理想解决方案

在当今数字化时代&#xff0c;数据中心作为海量数据存储、处理与传输的核心枢纽&#xff0c;其服务器的高效稳定运行至关重要。服务器作为其核心设备&#xff0c;对时钟信号的精度和稳定性提出了严苛要求——微小的时序误差可能导致数据传输失败或系统宕机。爱普生 SG2520HHN 差…

LeetCode 155题解 | 最小栈

最小栈 一、题目链接二、题目三、算法原理思路1&#xff1a;用一个变量存储最小元素思路2&#xff1a;双栈普通栈和最小栈 四、编写代码五、时间复杂度 一、题目链接 最小栈 二、题目 三、算法原理 栈用数组、链表实现都行&#xff0c;最主要的就是在能在常数时间内检索到最…

es+kibana---集群部署

其实一般es要跑3个节点的&#xff0c;这样才能做高可用&#xff0c;处理并发大&#xff0c;但是我这里只是一个pod mkdir -p /stroe/data/es es搭建&#xff1a; #【拉取镜像】 #docker pull elasticsearch:6.8.7 #docker pull busybox:1.28 【导入镜像】 docker load -i es.…

WPF常用技巧汇总 - Part 2

WPF常用技巧汇总-CSDN博客 主要用于记录工作中发现的一些问题和常见的解决方法。 目录 WPF常用技巧汇总-CSDN博客 1. DataGrid Tooltip - Multiple 2. DataGrid Tooltip - Cell值和ToolTip值一样 3. DataGrid Tooltip - Cell值和ToolTip值不一样 4. DataGrid - Ctrl A /…

uniapp打包apk如何实现版本更新

我们做的比较简单&#xff0c;在后端设置版本号&#xff0c;并在uniapp的config.js中定义版本号&#xff0c;每次跟后端的进行对比&#xff0c;不一致的话就更新。 一、下载apk 主要代码&#xff08;下载安装包&#xff0c;并进行安装&#xff0c;一般得手动同意安装&#xf…

局部和整体的关系

Prompt&#xff1a;为什么要研究局部和整体的关系呢&#xff1f;是因为很多情况下&#xff0c;局部就能表达出整体&#xff1f; 这是一个非常本质的问题&#xff0c;其实你已经接近数学和物理中“几何本质”的核心了。我们研究局部和整体的关系&#xff0c;是因为&#xff1a;…

企业办公协同平台安全一体化生态入住技术架构与接口标准分析报告

全球组织数字化与智能化背景下 企业办公协同平台安全一体化生态入住技术架构与接口标准分析报告 一、背景与市场需求 市场规模与增量 根据Statista数据&#xff0c;全球协同办公平台市场规模预计从2023年的$480亿增长至2027年的$900亿&#xff0c;年复合增长率&#xff08;CAG…

【2025最新面试八股常问知识点】HTTP1.0,HTTP1.1,HTTP2.0,HTTP3.0,HTTP的进化之路。

HTTP 超文本传输协议&#xff08;英文&#xff1a;HyperText Transfer Protocol&#xff0c;缩写&#xff1a;HTTP&#xff09;是一种用于分布式、协作式和超媒体信息系统的应用层协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP或者HTTPS协议请求的…

【算法练习】归并排序和归并分治

文章目录 1.归并排序1.1 递归版本1.2 非递归版本 2.归并分治2.1 计算数组的小和2.2 计算翻转对 1.归并排序 归并排序的核心步骤是&#xff1a; 拆分&#xff1a;将无序数组不断对半拆分成小块&#xff0c;直到每个小块只剩一个元素&#xff08;自然有序&#xff09;。 合并&a…

域对齐是什么

域对齐&#xff08;Domain Alignment&#xff09;是在机器学习和计算机视觉等领域中常用的技术 定义 域对齐旨在将不同域&#xff08;Domain&#xff09;的数据映射到一个共同的特征空间中&#xff0c;使得来自不同域的数据在该空间中具有相似的分布。这里的“域”可以指代不…

【linux】git安装、升级

git安装、升级 一、快捷安装版本2.18.0二、自定义版本安装&#xff08;安装、升级&#xff09;1、移除旧文件2、安装所需依赖3、选择指定版本4、解压文件、编译5、增加环境变量&#xff0c;验证是否版本 三、升级 一、快捷安装版本2.18.0 yum install git git --version二、自…

编程日志4.24

栈的链表基础表示结构 #include<iostream> #include<stdexcept> using namespace std; //模板声明&#xff0c;表明Stack类是一个通用的模板&#xff0c;可以用于存储任何类型的元素T template<typename T> //栈的声明 //Stack类的声明&#xff0c;表示一…

《冰雪传奇点卡版》:探索冰雪世界的传奇旅程!

《冰雪传奇点卡版》以“纯净打金”为核心&#xff0c;摒弃复杂付费坑&#xff0c;回归经典传奇玩法。以下从核心玩法、资源获取、职业搭配、交易变现四维度展开&#xff0c;助你高效开启冰雪传奇之旅。 一、核玩法解析&#xff1a;如何高效获取资源&#xff1f; 1. 职业定位与…

DeepClaude开源程序可以实现代码生成、创作诗句以及内容创作等功能

一、软件介绍 文末提供程序和源码下载 DeepClaude开源程序是增强的 AI&#xff0c;可以实现代码生成&#xff1a;DeepSeek r1 Claude 3.7 十四行诗 - 无与伦比的性能&#xff01;内容创作&#xff1a;DeepSeek r1 Gemini 2.5 Pro - 卓越的质量&#xff01;OpenAI 兼容。流媒…

Java常用注解通俗解释

注解就像是给Java代码贴的"便利贴"&#xff0c;它们不会改变代码本身的逻辑&#xff0c;但能给编译器、开发工具或运行时环境提供额外信息。下面我用最通俗的方式解释Java中最常用的注解&#xff1a; 一、基础篇&#xff1a;人人必知的注解 1. Override - "我…