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)是一种在问题求解过程中,每一步都采取当前状态下最优(即最有利)的选择,从而希望导致最终的全局最优解的算法策略。 贪心算法的核心思想是做选择时&…...

Docker 离线安装指南
参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性,不同版本的Docker对内核版本有不同要求。例如,Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本,Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Neo4j 集群管理:原理、技术与最佳实践深度解析
Neo4j 的集群技术是其企业级高可用性、可扩展性和容错能力的核心。通过深入分析官方文档,本文将系统阐述其集群管理的核心原理、关键技术、实用技巧和行业最佳实践。 Neo4j 的 Causal Clustering 架构提供了一个强大而灵活的基石,用于构建高可用、可扩展且一致的图数据库服务…...

Python爬虫(一):爬虫伪装
一、网站防爬机制概述 在当今互联网环境中,具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类: 身份验证机制:直接将未经授权的爬虫阻挡在外反爬技术体系:通过各种技术手段增加爬虫获取数据的难度…...

DBAPI如何优雅的获取单条数据
API如何优雅的获取单条数据 案例一 对于查询类API,查询的是单条数据,比如根据主键ID查询用户信息,sql如下: select id, name, age from user where id #{id}API默认返回的数据格式是多条的,如下: {&qu…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...