首页 > 编程语言 >抽象类 vs 接口【概念解析系列_2】【C# 基础】

抽象类 vs 接口【概念解析系列_2】【C# 基础】

时间:2023-07-29 23:33:09浏览次数:47  
标签:set get C# 接口 vs 抽象类 方法 public

〇、前言

抽象类和接口的相似之处还是很多的,但是它们的侧重点不同,本文将简单梳理下。

一、简介与示例

1.1 抽象类

抽象类就是不能使用 new 方法进行实例化的类,即没有具体实例对象的类。

抽象类有点类似于“模板”的作用,目的是根据其格式来创建和修改新的类,对象不能由抽象类直接创建,只可以通过抽象类派生出新的子类,再由其子类来创建对象。

当一个类被声明为抽象类时,要在这个类前面加上修饰符 abstract,在抽象类中的成员方法可以包括一般方法和抽象方法。

抽象类中的方法就是仅包含声明语句的抽象方法。

抽象方法 就是以 abstract 修饰的方法。这种方法只声明返回的数据类型、方法名称、所需要的参数,没有方法体,也就是说抽象方法只需要声明而不需要实现。

当一个方法为抽象方法时,意味着这个方法必须被子类的方法所重写,否则其子类的该方法仍然是 abstract 的,而这个子类也必须是抽象的。

// 声明一个抽象类,包含一个抽象方法,但该方法未实现,返回类型为 string
abstract class MyAbstract
{
    public double parameter { get; set; }
    public abstract string AbMethod();
}
// 实现一个派生类,只能继承一个类
class MyClass : MyAbstract
{
    public override double parameter { get; set; }
    public override string AbMethod()
    {
        return "MyClass-AbMethod()");
    }
}

1.2 接口

接口声明了属性、方法和事件,这些都是接口的成员。接口是一组规则的集合,它规定了实现本接口的类或接口必须拥有这一组规则。体现了自然界“如果你是……则必须能……”的理念。

在 C# 8.0 之前,接口只包含成员的声明而不关心成员的实现,只是提供派生类实现的标准结构。在此之后时代变了,接口也可以拥有自己的带实现的方法,而且在未实现此方法的派生类中不能调用。

大部分情况下,接口还是被认为只包含声明,在派生类中进行实现。接口中包含实现一般发生在需求变化时,为了不影响之前的派生类,此时带上实现使得其他派生类不必须实现该方法。

接口是在一定粒度视图上同类事物的抽象表示。注意这里我强调了在一定粒度视图上,也就是分类依据,因为“同类事物”这个概念是相对的,它因为粒度视图不同而不同。比如说,一棵树和一个人,在生物这一粒度上,可以分为一类,但在动物这个粒度上,他们就不能成为同一类。

// 接口声明
interface IinterfaceName
{
	int id { get; set; } // 属性
	string name { get; set; }
	double price { get; set; }
	double SalePrice(int discount); // 方法
}
// 类实现接口
public class ClassName : IinterfaceName
{
    public int id { get; set; }
    public string name { get; set; }
    public double price { get; set; }
    public double SalePrice(int discount)
    {
        double saleprice = price * discount * 0.1;
        return saleprice;
    }
}

二、抽象类和接口的关系

如果单从具体代码来看,对这两个概念很容易模糊,甚至觉得接口就是多余的,因为单从具体功能来看,除多重继承外(C#,Java 中),抽象类似乎完全能取代接口。

那么到底本质区别是啥呢?抽象类和接口的区别在于使用动机。使用抽象类是为了代码的复用,而使用接口的动机是为了实现多态性。所以,如果你在为某个地方该使用接口还是抽象类而犹豫不决时,那么可以根据系统场景,想想你的动机是什么。

 概念方面的区别

接口是对动作的抽象,抽象类是对根源的抽象。

抽象类表示的是,这个对象是什么。接口表示的是,这个对象能做什么。比如,男人,女人,这两个人类,他们的抽象类是人,说明他们都是人。人可以吃东西,狗也可以吃东西,你可以把“吃东西”定义成一个接口,然后让这些类去实现它。

所以,在高级语言上,一个类只能继承一个类(包括抽象类)(正如人不可能同时是生物和非生物),但是可以实现多个接口(吃饭接口、走路接口)。

 应用方面的区别

接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用。

参考:https://www.cnblogs.com/binyao/p/4891306.html    https://www.cnblogs.com/sunzhenyong/p/3814910.html

标签:set,get,C#,接口,vs,抽象类,方法,public
From: https://www.cnblogs.com/czzj/p/AbstractClassAndInterface.html

相关文章

  • 【PY】pandas 处理 Excel 中错别字修正
    前言今天有友友问起来,如何对Excel进行操作,对里面的内容进行错别字修正,那接下来由博主来为各位读者细细讲解一番;首先想到的是用xlrd去读取Excel里面的内容,不过呢,最新版的xlrd已经不支持.xlsx了,使用xlrd读取.xlsx文件时,会报错:XLRDError:Excelxlsxfile;notsupporte......
  • css 动画无限滚动
    创建一个外层容器(loop-wrap)和一个包含CSS标签的容器(loop)。CSS标签使用tag类样式化,并带有文本"#CSS"。使用@keyframesloop动画规则来实现标签的水平滚动效果。动画从初始位置滚动到左边50%的位置,并持续3秒后无限循环。通过将fade类应用于一个空白的div,在loop-wrap容器上创建了一个......
  • C语言分支与循环(12)--- 练习题
    一.练习题1.给定两个数,求这两个数的最大公约数,如求24与18的最大公约数方法:假设m=24n=181.将24与18进行取模,得到的结果是商1,余数为6,有余数证明并没有被整除2.将18再模6,可以得到商3余0,所以我们可以得到6是我们的最大公约数3.如果声明一个变量r来接收数据,如果r=0则代表n为最大公约数,......
  • odoo post account move
    D:\odoo\odoo16\addons\stock_account\models\stock_valuation_layer.py_validate_accounting_entriesifam_vals:print(am_vals)print('-------------------------------------')foreachinam_vals:......
  • .NET Core 6.0 配置自定义JWT鉴权
    JWT授权配置1、安装Microsoft.IdentityModel.Tokens包;2、创建一个认证用户信息实体类UserInfo3、创建一个JWT配置类JWTTokenOptions   publicclassJwtTokenOptions   {       ///<summary>       ///JWT认证Key       ///</sum......
  • 图注意力网络论文详解和PyTorch实现
    前言 图神经网络(gnn)是一类功能强大的神经网络,它对图结构数据进行操作。它们通过从节点的局部邻域聚合信息来学习节点表示(嵌入)。这个概念在图表示学习文献中被称为“消息传递”。本文转载自P**nHub兄弟网站作者|EbrahimPichka仅用于学术分享,若侵权请联系删除欢迎关注公......
  • [BJDCTF 2020]easy_md5
    [BJDCTF2020]easy_md5题目来源:nssctf题目类型:web涉及考点:弱比较、SQL注入1.题目给了一个传入口,先随便传点数据发现传入什么都没有回显,尝试抓包:在相应包中看到hint:select*from'admin'wherepassword=md5($pass,true)这里介绍下md5函数的知识点:md5($a):返回a......
  • 群晖docker nastools搭建家庭影音中心
    1.所需镜像nastools(2.9.0),nastools2.9.1版本之后,只能够使用PT下载,对于没有PT只能够用BT的小伙伴,选这个版本nastools作用主要是对下载的电影电视剧等进行整理,方便后边的jellyfin更好的识别。同时,能够做硬链接,方便PT的小伙伴保种,对于不需要保种的,可以使用移动的方式qbittore......
  • PyTorch的数据类型
    python和pytorch中的类型对比:我们可以发现pytorch中每中类型后面都有一个Tensor。但是很遗憾PyTorch没有String类型。我们在做NLP的时候会遇到String类型处理的问题,我们会将string转化问数值:one-hot[0,1,0,0,....]Embeddingword2vecglove1Datatype我们需要注......
  • Modbus tcp转ETHERCAT网关modbus tcp主从站区别
    捷米JM-ECT-TCP网关能够连接到Modbustcp总线和ETHERCAT总线中,实现两种不同协议设备之间的通讯。这个网关能够大大提高工业生产的效率和生产效益,让生产变得更加智能化。捷米JM-ECT-TCP是自主研发的一款ETHERCAT 从站功能的通讯网关。该产品主要功能是将ETHERCAT 网络和MODBU......