首页 > 编程语言 >【C#】基础类、结构、抽象类、接口的相关概念

【C#】基础类、结构、抽象类、接口的相关概念

时间:2024-02-03 10:55:33浏览次数:24  
标签:C# 成员 接口 抽象类 结构 方法 构造函数

先来简单说一下他们各自的含义是什么: 
1. 类(class):
类类型是由字段数据(成员变量)和操作字段数据的成员(属性、方法、构造函数、事件等)所构成的自定义类型。其中字段数据表示类实例(对象)的 状态。
2.结构(struct):
C#中结构类型和类类型在语法上非常相似,他们都是一种数据结构,都可 以 包括数据成员和方法成员。
3.抽象类(abstract):
(1):抽象类是特殊的类,只是不能被实例化;
(2):除此以外,具有类的其他特性;
(3):重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。
(4):另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们
4.接口(interface):
接口是引用类型,类似于类,和抽象类的相似之处有三点:
(1):不能实例化;
(2):包含未实现的方法声明;
(3):派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);
另外,接口特性如下:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他成员,
例如:常量、域、构造函数、析构函数、静态成员。
一个类可以直接继承多个接口,但只能直接继承一个类。
5.类与结构的区别:
(1):类是引用类型,它在堆(heap)中分配空间,栈中保存的只是引用。
结构是值类型,它在栈(Stack)中分配空间。
(2):类对象通常用来传递大数据,而结构对象则用来传递小数据。
(3):类可以被继承,而结构则不支持。
(4):结构对象不能像类对象一样赋值为null。
(5):结构不能像类一样定义析构器。
(6):结构不能像类一样定义为抽象的。
(7):在结构中不能重写方法,除非是object类型的如下方法:
Equals()
GetHashCode()
GetType()
ToString() 
若要让结构具有多态特性,可以让其实现接口。
(8):在类中定义的事件是线程安全的,而结构则不是。
(9):结构总是具有一个默认的公共无参构造函数,但却不能像类一样<br/>定义私有的无参构造函数(结构也不能再定义公共的无参构造函数,这与类不相同)。
(10):类中的静态构造函数会被调用,而结构却不能。因此在结构中<br/>定义的静态构造函数,虽然可以编译通过,但却没有价值。
(11):结构不能像类一样定义volatile字段。volatile字段主要用于并发,它相当于方法体的lock。
(12):可以对结构类型使用sizeof,对类则不行。
(13):类的字段会被自动初始化为0/false/null,而结构则不能。
(14):在结构中不能直接对字段初始化,而类则可以。
(15):结构和类对于System.Object.Equals()方法的体现是不相同的。 
6.类与抽象类:
(1):都可以被继承 ;
(2):抽象类不能被实例化,只是用来继承的。普通类可以实例化 ;
(3):抽象方法只有含方法声明而没有方法体且必须包含在抽象类里面 ;
(4):子类继承抽象类必须实现抽象类中的抽象方法除非子类也是抽象类
(5):抽象类中可以包含抽象方法也可以包含实例方法;
7.接口与类的区别:
(1):接口类似于类,但接口的成员都没有执行方式,它只是方法、属性、事件和索引符的组合而已,并且也只能包含这四种成员;类除了这四种<br/>成员之外还可以别的成员(如字段)。
(2):不能实例化一个接口,接口只包括成员的签名;而类可以实例化(abstract类除外)。
(3):接口没有构造函数,类有构造函数。
(4):接口不能进行运算符的重载,类可以进行运算符重载。
(5):接口的成员没有任何修饰符,其成员总是公共的,而类的成员则可以有修饰符(如:虚拟或者静态)。
(6):派生于接口的类必须实现接口中所有成员的执行方式,而从类派生则不然。
那么为什么还要有接口呢?
主要原因是它是一种有效的契约。
类有一些成员,不考虑把这些成员组合在一起,类只是一个拥有各种方法、字段和属性的列表,但为了能以某种方式使用类,必须知道类能执行那些功能,具体的操作就是声明执行一个或多个接口的类,类执行接口的方式是从接口中派生,再提供这个接口中定义的所有成员的执行方式。
8.抽象类和接口之间的异同 
相同点: 
(1):都可以被继承
(2):都可以有方法的声明
(3):都不可以被实例化
(4):子类必须实现基类的方法除非子类是抽象类
不同点: 
(5):抽象类属于多继承,接口属于单继承
(6):抽象类可以包含实例方法而接口不能
(7):接口支持回调抽象类不能
(8):子类实现抽象基类方法必须用override关键字而实现接口方法则不用override关键字
(9):接口是一组行为规范,抽象类是一个不完全的类,着重于族的概念
(10):接口可以作用于值类型和引用类型,抽象类只能作用于引用类型(例如:Struct只能继承接口)
(11):接口多定义对象的行为,抽象类多定义对象的属性。
(12):如果要设计小而简练的功能块,则使用接口,如果要设计大的功能单元,则使用抽象类
(13):接口对应是面向对象编程思想的重要原则:面向接口编程
(14):抽象类对应则是设计模式的的精髓:面相抽象编程

标签:C#,成员,接口,抽象类,结构,方法,构造函数
From: https://www.cnblogs.com/VisionCodeBlog/p/18004423

相关文章

  • docker卸载安装的程序
    如果您想卸载Docker中的容器,以MYSQL,可以按照以下步骤进行操作:1.查看容器,获取MYSQL的容器IDdockerps2.停止并删除正在运行的MYSQL。您可以使用以下命令来停止和删除MYSQL:dockerstop<容器名称或ID>dockerrm<容器名称或ID>请将`<容器名称或ID>`替换为您要停止和删除......
  • CF887E Little Brother
    (题目传送门)迟到的模拟赛补题。考场上二分写shi了,于是学习一下优秀的二分写法。做法很显然,圆心必然在线段的中垂线上,预处理与每个圆相交的圆心的在中垂线上的范围,打到数轴上,最后扫描线。自己写时对二分预处理圆心范围的讨论过于复杂,结合计算几何的知识,运用同向法可大大减少分......
  • 【C++】类和对象(一)[类的相关定义及this指针]
    C语言是面向过程的,关注的是过程,分析出求解问题的步骤,通过函数调用逐步解决问题。C++是基于面向对象的,关注的是对象,将一件事情拆分成不同的对象,靠对象之间的交互完成。C++在C语言的基础上增加了面向对象编程,C++支持面向对象程序设计。类是C++的核心特性,通常被称为用户定义的类......
  • 一次人脸识别ViewFaceCore使用的经验分享,看我把门店淘汰下来的POS机改成了人脸考勤机
    POS软件是什么?你好意思吗,还在用老掉牙的Winform。   门店被淘汰的POS机销售终端——POS(pointofsale)是一种多功能终端,把它安装在信用卡的特约商户和受理网点中与计算机联成网络,就能实现电子资金自动转账,它具有支持消费、预授权、余额查询和转账等功能,使用起来安全、......
  • CF1765C
    请看一副扑克牌。每张牌有\(4\)种花色,每种花色正好有\(n\)张牌--因此,这副牌的总数是\(4n\)。这副扑克牌是随机洗牌的,因此扑克牌中\((4n)!\)种可能的牌序都有相同的概率成为洗牌的结果。假设\(c_i\)是一副牌中\(i\)的第3张牌(从上到下)。Monocarp开始从一副牌中一张......
  • docker安装MySQL
    可以通过以下步骤使用Docker安装MySQL:1.找到当前可用的MySQL镜像。可以在DockerHub上搜索MySQL镜像,或者使用其他可信赖的镜像源。2.拉取所需的MySQL镜像到本地。使用以下命令拉取MySQL镜像(这里以MySQL5.7版本为例):```bashdockerpullmysql:5.7```3.准备一个目录用于存储MyS......
  • Ubuntu编译报错:fatal error: bits/libc-header-start.h: No such file or directory
    Ubuntu编译报错:fatalerror:bits/libc-header-start.h:Nosuchfileordirectory具体报错如下:fromhost/minilua.c:33:/usr/include/limits.h:26:10:fatalerror:bits/libc-header-start.h:Nosuchfileordirectory26|#include<bits/libc-header-start.h>......
  • react antd的Table中,如何动态的改变表格数据
    在ReactAntd中,如果您改变了Table组件的数据源(dataSource),Table会自动重新渲染以反映新的数据。因此,只要您在状态或props中正确更新数据源,Table就会自动更新。以下是一个示例代码片段,展示如何使用React状态(state)和按钮来更改数据源并更新Table组件:importReact,{useState}fr......
  • CentOs安装docker
    要在CentOS上安装Docker,可以按照以下步骤进行操作:1.更新系统软件包:首先,确保系统已更新到最新版本。打开终端并运行以下命令:sudoyumupdate2.安装必要的软件包:Docker需要一些依赖软件包,可以通过以下命令安装:sudoyuminstall-yyum-utilsdevice-mapper-persistent-data......
  • linux目录误删文件 /lib64/ld-linux-x86-64.so.2: bad ELF interpreter: No such file
    背景接同事求助一台生产主机误删了文件导致几乎所有命令都无法使用,应用无法访问。误删命令rm-f/*现象除了cd命令可用,几乎所有的命令都报如下错误:lsbash:/usr/bin/ls:/lib64/ld-linux-x86-64.so.2:badELFinterpreter:Nosuchfileordirectory问题分析这个命令......