〇、前言

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

一、简介与示例

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# 基础】的更多相关文章

  1. 【JAVA】笔记(5)--- final;抽象方法;抽象类;接口;解析继承,关联,与实现;

    final: 1.理解:凡是final修饰的东西都具有了不变的特性: 2.修饰对象: 1)final+类--->类无法被继承: 2)final+方法--->方法无法被覆盖: 3)final ...

  2. Java 的抽象特性:抽象类与接口深度解析

    要点: 抽象类 接口 抽象类与接口的差别 一. 抽象 对于面向对象编程来说,抽象是它的四大特征之中的一个. 在Java中,能够通过两种形式来体现OOP的抽象:接口和抽象类. 接口和抽象类为我们提供了一 ...

  3. C++中的抽象类和接口

    1,在 C++ 语言中,并不直接支持面向对象中的抽象类和接口概念,但是 C++ 语言 却可以间接实现这些概念: 2,什么是抽象类: 1,面向对象中的抽象(其实就是分类)概念: 1,在进行面向对象分析时 ...

  4. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  5. 夯实Java基础系列6:一文搞懂抽象类和接口,从基础到面试题,揭秘其本质区别!

    目录 抽象类介绍 为什么要用抽象类 一个抽象类小故事 一个抽象类小游戏 接口介绍 接口与类相似点: 接口与类的区别: 接口特性 抽象类和接口的区别 接口的使用: 接口最佳实践:设计模式中的工厂模式 接 ...

  6. Java基础系列4:抽象类与接口的前世今生

    该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架. 1.抽象类: 当编写 ...

  7. 转载:详细解析Java中抽象类和接口的区别

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...

  8. 详细解析Java中抽象类和接口的区别

    在Java语言中, abstract class 和interface 是支持抽象类定 义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和in ...

  9. 详细解析Java中抽象类和接口的区别(转)

    转自:http://dev.yesky.com/436/7581936.shtml 在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机 ...

  10. C++解析(24):抽象类和接口、多重继承

    0.目录 1.抽象类和接口 1.1 抽象类 1.2 纯虚函数 1.3 接口 2.被遗弃的多重继承 2.1 C++中的多重继承 2.2 多重继承的问题一 2.3 多重继承的问题二 2.4 多重继承的问题 ...

随机推荐

  1. SSM整合之基础xml文件以及基础理解

    文章目录 前言 什么是SSM框架 实例 pom依赖 Spring 文件配置 最后 展示代码 总结 前言 最近在学习SSM框架,就去找了一些视频来看,写一篇整合的文章,文章包括一些整合的依赖,以及创建的 ...

  2. LeetCode刷题之652寻找重复的子树

    继续每日分享一道算法题,监督自己学习,不落下算法,有需要一起打卡的uu,可以一起加油呀! 好了,现在开始看题了哈: 给定一棵二叉树 root,返回所有重复的子树. 对于同一类的重复子树,你只需要返回其 ...

  3. 【开源游戏】Legends-Of-Heroes 基于ET 7.2的双端C#(.net7 + Unity3d)多人在线英雄联盟风格的球球大作战游戏。

    Legends-Of-Heroes 一个LOL风格的球球大作战游戏,基于ET7.2,使用状态同步  Main 基于C#双端框架[ET7.2],同步到ET主干详情请看日志.(https://github ...

  4. 高精度------C++

    高精度运算------C++ (加减乘除) 例:ZOJ2001 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1001 The ...

  5. 2021-07-15:接雨水 II。给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水。

    2021-07-15:接雨水 II.给你一个 m x n 的矩阵,其中的值均为非负整数,代表二维高度图每个单元的高度,请计算图中形状最多能接多少体积的雨水. 福大大 答案2021-07-15: 小根堆 ...

  6. vue全家桶进阶之路32:Vue3 WatchEffect和watch 监听

    在 Vue 3 中,watchEffect 是一个用于监听响应式数据变化的 API.它可以在函数内部自动跟踪数据的依赖,并在依赖变化时重新运行函数. watchEffect 的作用以及各个参数的功能讲 ...

  7. Java中synchronized的优化

    本文介绍为了实现高效并发,虚拟机对 synchronized 做的一系列的锁优化措施 高效并发是从 JDK5 升级到 JDK6 后一项重要的改进项,HotSpot 虚拟机开发团队在 JDK6 这个版本 ...

  8. 【Java】按钮数组波纹效果

    简介 最近Java学到了布局管理器,看到GridLayout就很有意思,老师说可以做Excel表格什么的,心中突发奇想,于是就想做一个波纹状按钮效果(事后一想可能是我键盘光效的影响-.-),网上一搜, ...

  9. 越小越好: Q8-Chat,在英特尔至强 CPU 上体验高效的生成式 AI

    大语言模型 (LLM) 正在席卷整个机器学习世界.得益于其 transformer 架构,LLM 拥有从大量非结构化数据 (如文本.图像.视频或音频) 中学习的不可思议的能力.它们在 多种任务类型 上 ...

  10. macbook苹果m1芯片训练机器学习、深度学习模型,resnet101在mnist手写数字识别上做加速,torch.device("mps")

    apple的m1芯片比以往cpu芯片在机器学习加速上听说有15倍的提升,也就是可以使用apple mac训练深度学习pytorch模型!!!惊呆了 安装apple m1芯片版本的pytorch 然后使 ...