C# 子类、接口
栏目总目录
子类
继承的概念
- 继承机制:C#支持单继承,即一个类只能直接继承自一个基类。但基类本身可以继承自另一个类,从而实现继承链。
- 继承关键字:使用冒号(
:)表示继承关系,子类在声明时指定其基类。
子类的成员
- 继承的成员:子类会继承基类的非私有成员(public、protected、internal、protected internal)。私有成员(private)不会被继承。
- 新增的成员:子类可以定义自己的新成员,这些成员与继承自基类的成员共存。
- 重写的成员:子类可以使用
override关键字重写继承自基类的虚方法(virtual methods)或抽象方法(abstract methods)。重写允许子类为继承的方法提供特定的实现。
访问修饰符与继承
- 访问修饰符:基类和子类成员的访问级别会影响它们的可访问性和继承性。例如,私有成员在子类中不可见,而受保护的成员(protected)在派生类中可见但在外部不可见。
- 内部(internal)与受保护内部(protected internal):这两种访问修饰符在继承时具有特定的作用域。internal成员在同一程序集中可见,而protected internal成员在同一程序集及其派生类中可见。
构造函数与析构函数
- 构造函数:子类在实例化时会首先调用基类的构造函数(如果有的话)。如果基类有无参构造函数,则子类的无参构造函数会隐式调用它。如果基类只有带参数的构造函数,则子类必须显式调用基类的构造函数,通常是在子类构造函数的初始化列表中完成。
- 析构函数:子类析构函数会先执行子类的清理代码,然后自动调用基类的析构函数(如果存在)。
示例
class Base
{public Base(){Console.WriteLine("Base constructor");}~Base(){Console.WriteLine("Base destructor");}
}class Derived : Base
{public Derived() : base() // 显式调用基类构造函数(虽然是隐式也可以){Console.WriteLine("Derived constructor");}~Derived(){Console.WriteLine("Derived destructor");}
}class Program
{static void Main(){Derived d = new Derived();d = null; // 假设这里触发了垃圾回收,但实际上需要GC.Collect()来强制GC.Collect(); // 强制垃圾回收以触发析构函数GC.WaitForPendingFinalizers(); // 等待所有析构函数执行完毕}
}
抽象类与密封类
- 抽象类:抽象类不能被实例化,但可以作为其他类的基类。抽象类可以包含抽象方法(只有声明没有实现的方法),这些方法必须在非抽象派生类中被重写。
- 密封类:密封类(使用
sealed关键字修饰)不能被其他类继承。这有助于防止类被不恰当地扩展。
你提到的概念是面向对象编程(OOP)中非常基础且重要的部分,特别是在C#、Java等语言中。下面我将详细解释这些概念,并给出一些示例代码。
示例
abstract class Animal
{public abstract void MakeSound(); // 抽象方法
}class Dog : Animal
{public override void MakeSound(){Console.WriteLine("Woof");}
}sealed class Cat : Animal
{// 错误:不能从密封类继承// class Kitten : Cat {}public override void MakeSound(){Console.WriteLine("Meow");}
}class Program
{static void Main(){// Animal a = new Animal(); // 错误:Animal是抽象类,不能被实例化Dog d = new Dog();d.MakeSound(); // 输出: WoofCat c = new Cat();c.MakeSound(); // 输出: Meow}
}
接口实现
- 接口实现:虽然子类直接继承自基类,但子类也可以实现接口。接口实现与类继承不同,接口定义了一组方法、属性等成员的规范,而不提供实现。实现接口的类必须为接口中的每个成员提供具体实现。
示例
using System;public class Animal
{public void Eat(){Console.WriteLine("This animal eats food.");}
}public class Dog : Animal
{public override void Eat(){Console.WriteLine("Dog eats meat.");}public void Bark(){Console.WriteLine("Dog barks.");}
}class Program
{static void Main(string[] args){Dog myDog = new Dog();myDog.Eat(); // 输出: Dog eats meat.myDog.Bark(); // 输出: Dog barks.}
}
在这个示例中,Dog类继承自Animal类,并重写了Eat方法。此外,Dog类还定义了自己的Bark方法。在Main方法中,我们创建了Dog类的一个实例,并调用了它的Eat和Bark方法。
接口
接口定义
- 基本定义:接口是一种引用类型,使用
interface关键字声明。它指定了一组方法、属性、事件和索引器的规范,但不提供这些方法的具体实现。 - 命名约定:按照惯例,接口名称通常以大写字母“I”开头,后跟接口名称的其余部分,如
IExampleInterface。 - 成员定义:接口中的成员只有声明,没有实现。成员声明使用分号结束,而不是大括号。
- 访问修饰符:接口成员默认为
public,且不允许使用private或protected修饰符。
接口特性
- 不能直接实例化:接口本身不能被实例化,因为它不包含实现。只有实现了接口的类或结构才能被实例化。
- 抽象成员:接口中的所有成员都是抽象的,即它们不包含实现代码。
- 多继承:接口支持多继承,一个接口可以继承自一个或多个其他接口。
- 隐式与显式实现:类可以实现接口,并通过隐式或显式方式提供接口成员的实现。隐式实现允许通过类实例直接访问接口成员,而显式实现则要求通过接口实例来访问。
用途
- 定义契约:接口定义了一组规范,实现接口的类必须遵循这些规范。这有助于确保不同类之间的互操作性。
- 解耦:通过接口,可以实现类之间的解耦,即类的实现细节对彼此是透明的。这有助于降低系统的复杂性和提高可维护性。
- 多态性:接口是实现多态性的重要手段之一。通过接口引用,可以指向实现了该接口的任何类实例,从而允许在运行时动态地替换对象的行为。
- 依赖注入:在依赖注入等设计模式中,接口被广泛用于定义服务的契约,以便在不修改代码的情况下替换服务的实现。
实现
- 实现接口的类:只有类和结构(在C#中)才能实现接口。实现接口的类必须提供接口中声明的所有成员的实现。
- 实现语法:在类定义中,通过冒号(
:)后跟接口名称来指定该类实现的接口。如果类实现了多个接口,接口名称之间用逗号分隔。 - 接口继承:当类实现了某个接口时,它也可以继承该接口继承的所有其他接口的成员。这意味着实现接口的类必须提供所有这些接口成员的实现。
与类的比较
- 继承关系:类只能单继承(即只能继承自一个基类),但接口支持多继承。
- 实现与继承:类继承不仅是说明继承(即继承基类的声明),也是实现继承(即继承基类的实现)。而接口继承只是说明继承,即派生接口继承了父接口的成员声明,但没有继承实现。
- 成员类型:接口只能包含方法、属性、事件和索引器的声明,不能包含字段、常量、运算符、实例构造函数、析构函数或静态成员。类则可以包含所有这些类型的成员。
示例
public interface IExampleInterface
{void Method1();int Property1 { get; set; }
}public class ExampleClass : IExampleInterface
{public void Method1(){Console.WriteLine("Method1 implementation");}public int Property1 { get; set; }
}
在这个示例中,IExampleInterface接口定义了一个无返回值的方法Method1和一个读写属性Property1。ExampleClass类实现了这个接口,并提供了Method1方法和Property1属性的具体实现。
相关文章:
C# 子类、接口
栏目总目录 子类 继承的概念 继承机制:C#支持单继承,即一个类只能直接继承自一个基类。但基类本身可以继承自另一个类,从而实现继承链。继承关键字:使用冒号(:)表示继承关系,子类在声明时指定…...
Qt实现圆形窗口
重新实现paintEvent()函数。 效果如下: 效果为蓝色区域,背景是vs接面,代码直接复制可用,留给有需要的人。 #ifndef CircleWidget_h__ #define CircleWidget_h__#include <QWidget>class CCircleWidget : public QWidget {Q…...
LeetCode 算法:有效的括号 c++
原题链接🔗:有效的括号 难度:简单⭐️ 题目 给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。 有效字符串需满足: …...
react和vue的diff算法的差别
React 的 Diff 算法 React 的 diff 算法主要基于以下几个原则: 同层比较: React 只会比较同一层级的节点,不会跨层级比较。假设跨层级的变化较少,从而简化了算法,提高了性能。 深度优先遍历: React 采用深…...
算法【滑动窗口】
滑动窗口指的是维持左、右边界都不回退的一段范围,来求解很多子数组(串)的相关问题。 滑动窗口的关键是找到范围和答案指标之间的单调性关系(类似贪心)。 滑动过程:滑动窗口可以用简单变量或者结构来维护…...
【RISC-V设计-06】- RISC-V处理器设计K0A之ALU
【RISC-V设计-06】- RISC-V处理器设计K0A之ALU 文章目录 【RISC-V设计-06】- RISC-V处理器设计K0A之ALU1.简介2.顶层设计3.内部结构4.端口说明5.操作码说明6.设计代码7.总结 1.简介 算术逻辑单元(Arithmetic Logic Unit,简称 ALU)是计算机中…...
MyIP:强大且简单好用!
在这个数字化的时代,IP地址就像是我们的网络身份证。各位在日常的工作中,肯定会会遇到需要和 IP 地址相关的需求。 今天和大家聊一聊一个非常好用的开源 IP 工具项目 - MyIP。 简介 MyIP一个开源IP工具箱,提供了一系列的网络检测工具&…...
Redis作为缓存,如何与MySql的数据进行同步?
允许延时一致的业务 概念 采用异步通知使用MQ作为中间件,更新数据之后通知缓存删除利用canal中间件,不需要修改业务代码,伪装成Mysql的一个从节点,canal通过读取binlog数据更新缓存 强一致性业务 概念 采用Redission提供的读写锁…...
Android 通知栏推送功能
Android 通知栏推送功能 Android 通知栏推送功能 让消息在用户的通知栏上显示,并且点击后跳转到指定的页面 MainActivity.Java import android.app.Notification; import android.app.NotificationChannel; import android.app.NotificationManager; import andro…...
【LVS】防火墙mark标记解决调度问题
实验环境是在之前部署DR模式集群的基础上做的,参考如下 部署DR模式集群 以http和https为例,当我们在webserver中同时开放80和443端口,那么默认控制是分开轮询的,就会出现了一个轮询错乱的问题: 当第一次访问80被轮询…...
算法笔记|Day20回溯算法II
算法笔记|Day20回溯算法II ☆☆☆☆☆leetcode 39. 组合总和题目分析代码 ☆☆☆☆☆leetcode 40.组合总和II题目分析代码 ☆☆☆☆☆leetcode 131.分割回文串题目分析代码 ☆☆☆☆☆leetcode 39. 组合总和 题目链接:leetcode 39. 组合总和 题目分析 本题采用回…...
Oracle认证1Z0-071线上考试注意事项
目录 一、前言二、回顾过往战绩第一次 裸考🐒第二次 背题库硬考!🐒第三次 软件卡住,寄!🙈第四次 汇总纠错,通过!🌚 三、考试流程四、考试注意事项1. 是否需要科学上网2. …...
【C++ 面试 - 基础题】每日 3 题(八)
✍个人博客:Pandaconda-CSDN博客 📣专栏地址:http://t.csdnimg.cn/fYaBd 📚专栏简介:在这个专栏中,我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话,欢迎点赞👍收藏&…...
影响LabVIEW工作效率的因素有哪些
影响LabVIEW工作效率的因素可以分为多个方面,涵盖硬件、软件、开发环境和编程习惯等。以下是一些常见的影响因素: 1. 硬件因素 处理器性能:处理器的速度和核心数量对LabVIEW程序的执行效率有很大影响。 内存大小:足够的内存可以保…...
linux 裸机.之SPV5210,dnw,usb,sdk,fastboot刷机(一)
linux 裸机.之SPV5210,dnw,usb,sdk,fastboot刷机(一)...
性能测试工具LoadRunner
前言👀~ 上一章我们介绍了性能测试的一些基本概念,重要的是性能测试的各项指标,今天我们使用性能测试工具LoadRunner简单的完成一次性能测试 性能测试Load Runner LoadRunner是什么? LoadRunner安装 LoadRunner脚本录制 1.录…...
智能归来:深入探索人工智能回归模型的奥秘
人工智能之回归模型 1. 回归模型的数学基础1.1 回归分析的基本原理1.1.1 目标变量与预测变量的关系1.1.2 线性回归模型 1.2 矩阵形式的回归模型1.2.1 回归方程的矩阵表示1.2.2 矩阵运算的基本性质及其在回归分析中的应用 1.3 总结 2. 最小二乘法 (Ordinary Least Squares, OLS)…...
swift 中,对象() 和 对象.init() 的共同点和异同点
在阅读同事的代码时,不同人对对象的初始化方式是不一样的,例如存在一个对象AController, 有些人创建的方式如下: let controller AController()也有人创建的方式如下: let controller AController.init()下面来说明一下&#…...
Google安装JSON-handle扩展
JSON-hande下载地址: JSON-Handle 官网 - 打开json格式文件的浏览编辑器 1. 重命名扩展文件(crx)后缀 为 zip。 2. 解压zip成文件夹,保存到指定目录。 3. Google浏览器地址栏输入 “chrome://extensions/”回车。然后开启 开发者模式。 4. 点击“加载…...
剖析算法内部结构----------贪心算法
什么是贪心算法? 贪心算法(Greedy Algorithm)是一种在问题求解过程中,每一步都采取当前状态下最优(即最有利)的选择,从而希望导致最终的全局最优解的算法策略。 贪心算法的核心思想是做选择时&…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
java 实现excel文件转pdf | 无水印 | 无限制
文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
