抽象类 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 多重继承的问题 ...
随机推荐
- shell自动化脚本,启动、停止应用程序
#!/usr/bin/env bash # 常量初始化 set_runtime_vars(){ # 日期时间 Now_Date=`date +"%Y-%m-%d %H:%M:%S" ...
- 批x网,登录加密(通过元素绑定的监听事件来找到加密函数)
网站 base64加密 aHR0cHM6Ly93d3cucGlnYWkub3JnLw== 逆向分析 https://blog.csdn.net/a_123_4/article/details/1208 ...
- iview中时间选择器组件改变日期格式
//改变视图的显示格式,但不会改变value的值的格式 format="yyyy-MM-dd" //改变value值的格式 @on-change="anZhuangDat ...
- vue中让嵌入的iframe完美自适应宽度、高度
涉及到系统集成的时候,前端我们经常会用到iframe嵌入,但是嵌入的时候经常有不适应的情况,太长或太宽.滚动条... 下面的方法可以做到使嵌入的iframe自适应宽度.高度, 1.嵌入iframe,加 ...
- 2022-03-06:金币路径。 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,……,AN 和一个整数 B。 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 i+1,i+
2022-03-06:金币路径. 给定一个数组 A(下标从 1 开始)包含 N 个整数:A1,A2,--,AN 和一个整数 B. 你可以从数组 A 中的任何一个位置(下标为 i)跳到下标 i+1,i+ ...
- Winform 遮罩懒人处理法
前言 之前有个项目需要执行一个略微耗时的操作大概五六七八九十秒这样子,这个时候程序不能做其他操作,只能等待操作完成.为了提升一丝使用体验同时让Winform程序看上去高级一点,就想到加一个遮罩层(Ma ...
- 【python基础】新建/运行python项目
1.新建python项目 在编写程序之前,我们需要新建一个项目(Project),在桌面双击PyCharm的快捷方式,等待片刻,打开如下所示的软件界面.点击New Project 在弹出的对话框中,需 ...
- 自动化测试-基础知识—Bash基础
Bash 在 Bash 中,美元符号 $ 可以用于引用变量或者表达式的值.Bash 中的变量并不需要事先声明,而是在第一次赋值时自动创建.基于这个特性,我们可以通过给变量名加上 $ 的方式来引用它的值 ...
- ChatGPT在线体验原理课-概览:ChatGPT 与自然语言处理
# 概览:ChatGPT 与自然语言处理 本文将介绍 ChatGPT 与自然语言处理的相关知识. ## ChatGPT 与图灵测试 图灵测试是人工智能领域的一个经典问题,它旨在检验计算机是否能够表现出 ...
- STL-queue(ACM)
重构函数(默认) queue<int> q; 基本操作 q.front(); // 队列最前面的元素q.back(); // 队列最后面的元素q.size(); // 返回队列长度q.em ...