C#虚基类继承与接口的区别

C#的继承、接口、抽象类理解 OOP三特性:继承、封装、多态继承:C#属于单继承,即派生类最多只能有一个直接基类,但可以传递继承,即A类派生B类,B类派生C类,派生类会保留所有基类以及传递基类的字段、属性、方法等所有内容。如果要在派生类中隐藏基类内容,可以通过new关键字实现,或是通过base来调用基类的内容传递继承示例:using System; using System.Collections.Generic; using... 阅读详情
 类 
定义新的数据类型以及这些新的数据类型进行相互操作的方法 
定义方式: 

  1. class Cat
  2. {
  3. }
  4. class Cat:object
  5. {
  6. }

C#中所有的类都是默认由object类派生来的,显示指定或者省略效果是一样的,所以上面的两个例子是完全相同的。

C#中类包括:抽象类、密封类、非抽象类
abstract:表示修饰的类不完整,也就是抽象类,只能用做基类。 在使用是不能直接实例化,
不能使用new运算符。
sealed:表示修饰的类不可派生,也就是密封类。

base:访问最近的基类,也就是当前类继承的类

  1. class Cat:Animal
  2. {
  3.   public void Cat()
  4.   {
  5.     base.Eat();
  6.   }
  7. }

以上例子中base代表Animal。
注意:base只能在类的内部使用。

接口 
一个接口定义一个协定。接口可以看成是特殊的抽象类,但是又有所区别。
一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。
接口可以包含方法、属性、事件和索引器。接口本身不提供它所定义的成员的实现,而抽象类中可以提供定义成员的实现。
接口只指定实现该接口的类或结构必须提供的成员。

接口本质上是一种类
不过他与类的区分还是很明显的——不能实例化
他的精髓在于提供一些类共同的地方,而且能“多继承”

我们知道所谓对象其实是数据和方法的封装。接口的作用更多的是工程上的,一般上我们用他来封装通用的行为,来达到程序的多态。

不必用object的观点来统一接口,在我的感觉中,继承简化对象结构,增加代码重用,接口抽象行为。

1. 接口本质上是类吗

这个,要看你认为“类的本质是什么”了,过多纠缠于这个说法,很容易陷入文字之争,意义不大。

2. 接口和类有什么区别和联系,主要是联系

区别:
类的定义需要“实现”,接口的定义只需要“声明”;
类能实例化出一个对象,接口不能;
类只能单根继承,接口可以多根继承;
继承一个类,相当于借用了它已实现的功能,实现一个接口,相当于对外做了一个承诺;
……

联系:类可以“实现”接口

3. 接口是否具备类的特征

这要看你认为哪些是“类的特征”,hehe,比如,“编译后会生成一个 .class 文件”算不算特征……

4. 接口是否是Object

不是。但可以用一个接口型的变量来引用一个对象,而且,被引用的对象,说到底,一定是一个 Object。

1、纯虚类与接口不同的是,纯虚类可以包含一些实现
2、用纯虚类包含一些基本的功能或方法
3、用接口来定义客户端与组件之间的通讯方法
4、虚基类的实现的变化可能会影响派生类
5、使用接口要比使用继承具有更强的适用性

接口的一些特征;
不可以包含任何实现;没有构造方法;任何成员都隐式声明为public;

接口是负责功能的定义,项目中通过接口来规范类,操作类以及抽象类的概念!
而类是负责功能的具体实现!

在类中也有抽象类的定义,抽象类与接口的区别在于:
抽象类是一个不完全的类,类里面有抽象的方法,属性,也可以有具体的方法和属性,需要进一步的专业化。
但接口是一个行为的规范,里面的所有东西都是抽象的!
一个类只可以继承一个基类也就是父类,但可以实现多个接口

PS:接口除了规范一个行为之外,在具体项目中的实际作用也是十分重要的,在面向对象的设计原则以及设计模式的使用中,无不体现作为一个接口的使用 好处,最直接的就是设计原则中OCP(开放封闭原则),我们使用接口,而不需要关心他的具体实现,具体实现的细节变化也无关客户端(使用接口的类)的使 用,对与扩展是开放的,我们可以另写一个接口的实现来扩展当前程序,而不影响上层的使用,但对修改是封闭的,即我们不能够再去修改接口的定义,当然这个 “不能够”是指在规范原则上不应该这么做!

接口的使用–多态的实现:

  1. public interface IPolimorphism()
  2. {
  3.    void Say();
  4. }

建立一个Class1.cs文件,定义两个类,扩展IPolimorfism:

  1. using System;
  2. using System.Windows.Forms;
  3. namespace NorthWind
  4. {
  5.   public class Red:IPolimorphism  //实现接口的方法
  6.   {
  7.       public void Say()  //不需要指定override关键字
  8.       {
  9.            MessageBox.Show("Red!");
  10.       }
  11.   }
  12.  
  13.   public class Yello:IPolimorphism
  14.   {
  15.       public void Say() //不需要指定override关键字
  16.       {
  17.            MessageBox.Show("Yello!");
  18.       }
  19.   }
  20.  
  21. }

另一个MainFrm.cs文件,应用程序入口处:

  1. using System;
  2. using System.Windows.Forms;
  3. namespace NorthWind
  4. {
  5. public class MainFrm : System.Windows.Forms
  6. {
  7.    [STAThread]
  8.    static void Main()
  9.    {
  10.        IPolimorphism red  = new Red();
  11.        red.Say();
  12.        IPolimorphism yello = new Yello();
  13.        yello.Say();
  14.    }
  15.  
  16. }
  17. }

  举个例子,有一个老汉,做了一个面饼,给了他的几个儿子,老大用这个饼,加上点馅,包一下,做成了包子,老二用这个面饼,在外面刷上油,撒上 料,烤一烤,做成了土家烧饼,老三呢,胡乱做,在饼上抹上乱七八糟的东西,烤一烤,做成了披萨饼.基类和派生类的关系就是这样,基类提供了基本的实现,派 生类就在上面添料,最终就成了每个人心中想要的饼.
那接口的故事则不一样,老汉没有给众人面,老汉这回给儿子们画了一个饼的设计图,规定了这个饼的厚度,直径等等,然后把这个规格表发给儿子们了,儿子们拿着画的饼,各自按自己的想法去做了.
两个故事的区别告诉我们,接口是一种规格,是一个统一的标准,在实际应用中,接口有两方法的作用.
1,通过接口更容易表现设计,更容易沟通,而且接口是没有实现代码的,因此,定好接口,再写实现代码,就算设计上有变动,也可以通过接口轻易实现修改.而如果不用接口的话,你将直接去写类,好不容易实现了一个类的代码,如果设计上有少许的变动,就要去改代码.
2.接口是写类的实现者看的,这好比建筑图纸是画给施工工人看的.

2025_NIPS_RAGRouter: Learning to Route Queries to Multiple Retrieval-Augmented Language Models 该研究聚焦检索增强生成(RAG)场景下的大语言模型(LLM)路由问题,提出了首个RAG感知的路由框架RAGRouter。核心解决现有路由方法依赖静态参数知识、忽略检索文档动态影响的缺陷,通过融合文档嵌入、RAG能力嵌入与对比学习,捕捉RAG引发的模型知识表征变化,为每个查询-文档对选择最优LLM。实验覆盖5个知识密集型任务、15个开源/闭源LLM,验证了RAGRouter在性能上超越最佳单LLM和非RAG感知路由方法,且通过阈值机制实现低延迟约束下的性能-效率平衡。 阅读详情

相关推荐

工业自动化进阶:西门子 S7-1200 PLC 调度 AGV 实现精确定点移动

本文介绍了基于西门子S7-1200PLC的AGV调度控制系统设计,包括系统架构、硬件选型和PLC程序设计。系统通过PROFINET通信实现PLC与AGV的数据交互,采用状态机控制逻辑实现任务管理、运动控制和闭环位置校正。重点阐述了通信协议实现、梯形图核心逻辑及系统调试优化方法。实际应用案例显示,该系统定位精度达±3mm,显著提升了物料配送效率。该方案为工业自动化升级提供了可靠的技术支持。

qq_52407556的博客 1889

C#中的虚类、密封类、抽象类

虚方法: 1、virtual方法表示此方法可以被重写, 也就是说这个方法具有多态.父类中的方法是通用方法,可以在子类中重写以重新规定方法逻辑.  2、virtual方法可以直接使用,和普通方法一样  3、不是必须重写的. 子类可以使用base.方法 的方式调用, 无论有没有在子类使用override去重写 virtual关键字只是明确标示此方法可以被重写, 其实它和一般的方法没有什么区别

lzp_lrp的专栏 8198

【MFiX后处理】MFiX中使用des_usr_var输出颗粒的传热量(2020-11-27更新变更输出变量名方法)

参考之前Yin的那一篇博客 https://www.cnblogs.com/Jay-CFD/p/10621274.html 输出一下颗粒传热量 使用的算例是fluid_bed_dem_2d 打开des scalar tracking 前面都和Yin那篇一样,打开enable user scalar tracking 输入2 因为第一个用来测试Y加速度了 第二个输出传热量 然后在output vtk中勾选好 更改源代码 源代码为des_thermo_newvalues.f 在mfix-GUI自带的ed

beidou111的博客 1533

C# 抽象类、虚拟类和私有类(大白话)

总结:抽象类、虚拟类和私有类是 C# 中常见的类的特性。它们分别用于提供接口规范、行为的默认实现或子类重写、以及封装一些辅助功能等。使用这些特性可以更加灵活地设计和实现 C# 类库中的各种类型。,类似于默认实现,子类可以选择重写;但子类并非必须提供实现(基类也可以实现功能方法)私有类是只能在同一命名空间的程序中使用。,即未被实现的方法,必须由子类实现。定义了两个方法:一个是虚拟方法。类的内部实例化,并且调用。无法从其他程序集中进行访问。具体实现必须由子类完成。

2301_78270249的博客 1334

深入解析EXI协议在ISO15118-2命令测试中的编解码实践

本文深入探讨了EXI协议在ISO15118-2车桩通信标准中的关键作用与实践方法。EXI编解码测试是确保通信准确性与效率的核心环节,文章详细介绍了从搭建测试环境、选择工具库到编写完整测试代码的全过程,并分析了结果差异的常见原因与调试技巧,为电动汽车充电系统的开发者提供了实用的技术指南。

potato的博客 1048

YOLOv11改进有效系列目录 - 包含卷积、主干、检测头、注意力机制、Neck上百种创新机制 - 针对多尺度、小目标、遮挡、恶劣天气等问题

在一些特定情况下,目标检测任务由于多种因素的影响,变得更加复杂和困难。以下是几类常见的困难目标检测场景:1. 小目标检测定义:小目标检测是指当目标在图像中的占比非常小时,模型需要准确识别和定位这些目标。典型场景包括远程监控、卫星图像分析等。挑战1. 低分辨率:由于目标在图像中占据像素较少,细节缺失,特征提取难度增加。2. 特征不足:小目标缺乏明显的形状和纹理特征,容易被复杂背景淹没。3. 检测难度大:由于小目标与背景之间的对比度较低,误检的几率上升。4. 数据不平衡。

qq_64693987的博客 4万+

C#学习之C#面向对象编程(类与实例、虚拟类、抽象类、封装类、静态类、范型)

介绍 ​ C#语言集成了Java和C++的优点,在全面的基础上发展了面向对象的概念,比如委托和范型,是从C++语言的函数指针和模版概念进化而来的,而单根的面向对象结构,即所有的对象都是继承于object类,这在很大程度上来自Java语言的思想。 主要内容:C#创建类和实例、虚拟类、抽象类、封装类、静态类、范型类、类的属性、方法、事件、C#语言委托远离和用法、匿名类、拓展方法 类和实例 1. 类和实例 ​ C#引入类的概念,以全面支持对象编程。使用class关键字定义一个类,可以在类前面添加各种修饰符。

m0_46637217的博客 2219

【100%通过率】华为OD机试真题2026双机位C卷 C语言 实现【加密算法】

【100%通过率】华为OD机试真题2026双机位C卷 Python&JS 实现【加密算法】有一种特殊的加密算法,明文为一段数字串,经过密码本查找转换,生成另一段密文数字串。规则如下

MISAYAONE的博客 652

C#虚拟与抽象方法详解

本文详细讲解了C#中virtual(虚拟)和abstract(抽象)的区别与用法。虚拟方法使用virtual关键字修饰,允许子类选择性重写,必须包含方法体;而抽象方法使用abstract关键字修饰,没有方法体,强制子类必须重写。文章通过代码示例展示了虚拟方法和抽象方法的定义方式、子类重写规则及调用方式,并总结了11点主要区别,包括关键字不同、实现要求不同、实例化限制等。虚拟方法提供可选重写,抽象方法则强制重写,这是两者最核心的差异。

莫踌躇 7580

ERROR conda.core.link:_execute(502): error occurred while installing conda-forge::setuptools 解决方案

本文主要介绍了ERROR conda.core.link:_execute(502): An error occurred while installing package mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge::setuptools-65.5.1-pyhd8ed1ab_0.FileNotFoundError(2, 系统找不到指定的文件。, None, 2) 解决方案,希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

华为od 面试八股文_C++_02_含答案

华为od 面试八股文_C++_02_含答案

MISAYAONE的博客 3122

c#之虚方法、抽象类、接口

抽象类通过abstract关键字声明,可以包含抽象方法(无实现)和普通方法。抽象类不能被实例化,只能作为基类被继承。// 抽象方法,无实现set;抽象类可以包含抽象方法和非抽象方法。子类必须实现所有抽象方法(除非子类也是抽象类)。抽象类可以包含字段、属性、构造函数等。

qq_58461091的博客 537

SDR 和 DDR 的区别

SDR 和 DDR 的差别,最明显提现在传输速率和频率上。DDR SDRAM与SDRAM的基本结构是相似的,最根本的区别在于DDR 支持在一个时钟周期内传输两次数据,,SDR 只能传输一次数据。

串起点滴 1961

C#虚基类继承与接口的区别 (转载)

类 定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指定或者省略效果是一样的,所以上面的两个例子是完全相同的。 C#中类包括:抽象类、密封类、非抽象类 abstract:表示修饰的类不完整,也就是抽象类,只能用做基类。 在使

shixueqian520的专栏 1298

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【转】C#虚基类继承与接口的区别

本文转自:http://blog.ppku.com/?p=58 类 定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指定或者省略效果是一样的,所以上面的两个例子是完全相同的。 C#中类包括:抽象类、密封类、非抽象类abstract:表示修...

weixin_30639719的博客 76

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

关于C#中的接口和抽象类的知识点小记

1.抽象类不能被实例化 2.类继承接口必须提供实现 C#虚基类继承与接口的区别 类 定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { // .......... } class Cat : object { // .......... } C#中所有的类都是默认由object类派生来的,显示指定或者省略效果是一样的,所以上面的两个例子是完全相同的。 C#中类包括:抽象类、密封类、非抽象类 abstract

yunxiaobaobei的博客 284

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

疑难杂症----继承与接口

1. C#虚基类继承与接口的区别   ①接口不包含任何实现,接口没有构造方法,所有成员都是public的,用接口来定义类,规范类,抽象类,而类则负责功能的具体的实现。接口里面所有的东西都是抽象的。   ②抽象类是不完全的类,里面有抽象的方法和属性,也可以有具体的方法和属性。   ③类里面则都是方法和属性的实现。   C#中一个类只可以派生于一个类,而可以实现多个接口。一个类...

weixin_30830327的博客 135

C#接口和继承的区别、联系与使用场景

本文详细介绍了C#中接口和继承的区别与联系,并讨论了它们各自的使用场景。继承支持构建类之间的层次结构,以及代码的重用和扩展。正确地应用接口和继承对于编写高质量、可维护和可扩展的代码非常重要。通过深入理解接口和继承的概念和用法,开发人员可以更好地应用它们来解决实际编程问题。在面向对象的编程中,接口和继承是常见的重要概念,它们都可以用于实现代码的重用和模块化。然而,它们具有不同的特点和适用场景,正确地应用接口和继承是编写高质量代码的关键。接下来,我们将详细讨论接口和继承之间的区别与联系。

故事不长丨的博客 1875

c#中继承和接口的区别与联系

c#中继承和接口的区别与联系 一. 定义: 1. 继承: 把两个或多个类的相同属性提取出来,将这些属性合在一起建立父类! 例:class A { public void Sum(int i,int j) { int sum = i + j; Console.WriteLine("I am A ,my sum ={0}",sum); } } class B : A { public void Minus(int i,int j)

进击的前端小白 1642

继承与接口的区别

需要多重继承?→ 选择接口需要共享代码实现?→ 选择抽象类定义跨体系行为?→ 选择接口需要封装状态?→ 选择抽象类设计公共API?→ 优先考虑接口构建框架基类?→ 考虑抽象类需要版本弹性?→ C#8.0+接口默认方法需要精确访问控制?→ 抽象类最终,在现代C#开发中,接口和抽象类都是必不可少的工具,理解它们的深层差异和适用场景,才能做出最合适的设计决策。

2201_75468164的博客 2077
上一篇: 本地时间和GMT(UTC)时间的转换
下一篇: c#中抽象类和虚方法的区别?
绝凌峰
博客等级 码龄18年 28粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值