抽象类 vs 接口【概念解析系列_2】【C# 基础】
〇、前言
抽象类和接口的相似之处还是很多的,但是它们的侧重点不同,本文将简单梳理下。
一、简介与示例
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
抽象类 vs 接口【概念解析系列_2】【C# 基础】的更多相关文章
- 【JAVA】笔记(5)--- final;抽象方法;抽象类;接口;解析继承,关联,与实现;
final: 1.理解:凡是final修饰的东西都具有了不变的特性: 2.修饰对象: 1)final+类--->类无法被继承: 2)final+方法--->方法无法被覆盖: 3)final ...
- Java 的抽象特性:抽象类与接口深度解析
要点: 抽象类 接口 抽象类与接口的差别 一. 抽象 对于面向对象编程来说,抽象是它的四大特征之中的一个. 在Java中,能够通过两种形式来体现OOP的抽象:接口和抽象类. 接口和抽象类为我们提供了一 ...
- C++中的抽象类和接口
1,在 C++ 语言中,并不直接支持面向对象中的抽象类和接口概念,但是 C++ 语言 却可以间接实现这些概念: 2,什么是抽象类: 1,面向对象中的抽象(其实就是分类)概念: 1,在进行面向对象分析时 ...
- 转:二十一、详细解析Java中抽象类和接口的区别
转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...
- 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!
目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接 ...
- Java基础系列4:抽象类与接口的前世今生
该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 1.抽象类: 当编写 ...
- 转载:详细解析Java中抽象类和接口的区别
在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...
- 详细解析Java中抽象类和接口的区别
在Java语言中, abstract class 和interface 是支持抽象类定 义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和in ...
- 详细解析Java中抽象类和接口的区别(转)
转自:http://dev.yesky.com/436/7581936.shtml 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机 ...
- C++解析(24):抽象类和接口、多重继承
0.目录 1.抽象类和接口 1.1 抽象类 1.2 纯虚函数 1.3 接口 2.被遗弃的多重继承 2.1 C++中的多重继承 2.2 多重继承的问题一 2.3 多重继承的问题二 2.4 多重继承的问题 ...
随机推荐
- Unity开发Hololens2—交互发布配置
Unity开发Hololens2-交互发布配置 环境配置 unity2021.3.15f visual studio 2019 pro MRTK 2.8.3 OpenXR 1.8.0 Hololens ...
- laravel框架三级联动,详细代码
这里运用到省份表中,下面是效果图 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 需要一个省份表,里面的字段要有个pid,name这些字段 下面是控制器代码,(Cit ...
- 2021-04-20:手写代码:最小生成树算法之Prim。
2021-04-20:手写代码:最小生成树算法之Prim. 福大大 答案2021-04-20: 解锁点,解锁边,解锁点,解锁边,一直解锁下去. 代码用golang编写.代码如下: package ma ...
- 2022-01-21:完美矩形。 给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形。这个矩形的左下顶点是 (xi,
2022-01-21:完美矩形. 给你一个数组 rectangles ,其中 rectangles[i] = [xi, yi, ai, bi] 表示一个坐标轴平行的矩形.这个矩形的左下顶点是 (xi, ...
- js 关于 replace 取值、替换第几个匹配项
〇.前言 在日常开发中,经常遇到针对字符串的替换.截取,知识点比较碎容易混淆,特此总结一下,仅供参考. 一.替换第一个匹配项 字符串替换 let strtest = "0123测试repla ...
- 7-2 Broken Pad (20 分)
1.题目描述: The party began, the greasy uncle was playing cards, the fat otaku was eating, and the littl ...
- Error in render: “TypeError: Cannot read property ‘0‘ of null“
我们web的同学运行程序时经常会遇到如下错误,而查找起来却相当费劲 看错误提示第一反应会想到是不是我的js 方法中的某个对象取值错误了,如: 但完全错了,当你把方法里的js 翻来覆去找了一遍又一遍,任 ...
- STM32H5移植zbar记录
ZBar是一种流行的二维码扫描和解码工具,它在嵌入式系统中拥有广泛的应用.在嵌入式系统中,我们面临着有限的资源和更严格的性能要求,因此,选择适当的库来完成特定的任务非常重要. ZBar适用于各种嵌入式 ...
- 2023-06-09:什么是Redis事务?原理是什么?
2023-06-09:什么是Redis事务?原理是什么? 答案2023-06-09: Redis中的事务是以一组命令的形式出现的,这些命令被认为是最小的执行单位.事务可以保证在一个单独独立的隔离操作中 ...
- SRE 的工作介绍
哈喽大家好,我是咸鱼 今天看到了一篇很不错的文章,作者是一名 SRE 工程师,在 Shopee 工作,base 新加坡 分享出来给大家看看 作者:卡瓦邦噶 原文链接:https://www.kawab ...