转载 何时用接口

C#WPF常用的9种布局方式详解 本文介绍WPF中常用的九种布局,Grid、StackPanel、WrapPanel、DockPanel、UniformGrid、Canvas、ScrollViewer、ViewBox、Border。 阅读详情
??????????????????????????????????????? 韩睿 ?
大李没告诉我接口与抽象类的区别,什么时候用接口,什么时候用实现继承。弄得我中饭也没吃好,老在琢磨这事,这不,一吃完饭,我就冲上楼,一个房间一个房间转,到处找大李。
过了好一阵,这老哥才和几个同事说说笑笑地回到办公室,我立即走上前,半请半拉地把他拽到电脑旁。“大李哥,我实在想得头晕,既然在VB.NET中接口有了这么大的发展空间,在形式上与抽象类如此相似,那么它们有什么区别?什么时候用接口呢?”
听着我一连串的问题,大李微笑着摇摇头,拍拍我的肩膀说:“小兄弟,不光是你弄不清,其实就是很有经验的程序设计师也对什么时候用接口,什么时候用抽象类而头痛咧。”
此话一出,我更是疑惑重重。不过反而安下心来,老鸟们都弄不清的问题,我不清楚也不必心中不安了。哈……
大李看着我忽忧忽喜的表情露出了一丝诧异,不过他没有理会,继续说:“但是这个问题我们还是有必要好好分析一下,让我们更明白接口与抽象类的具体含义。”
“我们早说过,抽象类是一种不能实例化而必须从中继承的类。抽象类可以完全实现,但更常见的是部分实现或者根本不实现,从而封装继承类的通用功能,它可以提供已实现的成员,因此,可以用抽象类确保特定数量的相同功能,但不能用接口这样做。”
“接口是完全抽象的成员集合,它的成员都无法在接口定义时实现,我们可以将它看作是为操作定义合同,接口的实现完全留给开发者去做。它们之间的区别,如果认真分析,还是有不少的:在VB.NET中,类只能是从一个基类继承,所以如果要使用抽象类为一组类提供多态性,这些类必须都是从那个类继承的;接口就不一样了,它不但可以用一个类或结构实现多个接口,一个接口还可以有多个实现。”
“也就是说,它们在提供多态性的问题上是有差别的?”我好象听懂了点什么。
“这是一个重要的区别,我们也可以从多态性的角度来考虑是要使用接口还是用抽象类。”大李同意了我的观点,“如果预计要创建组件的多个版本,我们应该创建抽象类。这是因为,抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。这是好处,当然也是问题,对吧?( 详见前文《脆弱的基类》 )另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。所以,如果创建的功能将在大范围的全异对象间使用,则使用接口。”
我想了一下,接着大李的话说:“能不能这样说,抽象类主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。”
大李对我伸出了大拇指:“不错,小伙子悟性很好呀!你想,我上午跟你说,要创建控件,首先就是要对一些接口进行实现以让系统能够识别( 详见前文《接口》 )。而各个控件之间的联系其实关联性并不大。所以,它们的基础大都是接口。但是,我们要注意一点,在组件设计时,如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。这是因为我们刚才说过的原因,抽象类允许部分实现类,而接口不包含任何成员的实现。”
“唔,明白了,它们之间的区别有点明白了。”我默默地点了点头。
“另外,有个通用的设计思想,如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。”大李又补充了一条建议。
  “看来设计的问题还是蛮大的,一般来说,怎么设计接口呢?”我接着问。
“为什么你所看到的编程书籍也好,程序例程也好,极少有对接口的描述,而对类实现继承的例子比比皆是?这就从一个侧面给我们提了一个醒,如果使用适当,接口可以成为很有用的工具。但如果使用不当,它们会变得非常棘手,甚至妨碍有效的编程。接口的设计与使用其实是一项高明的艺术。”大李郑重其事的说。
“艺术?”我惊叫了一声。
“没错,艺术!”大李又加重了一下语气,“ 通过接口与实现的方式,我们可以将同一类型的程序运用在不同的对象上面,而且不必修改原有类,相对子程序必须通过修改源程序代码才能够达到重用的目的,接口与实现不仅是伟大的进步,也是境界极高的程序设计艺术。”
“哦,这倒是真的。”我回想起今天看到的接口的例程。
“但是,最大的问题还是集中在接口设计上。”大李接着说,“接口一旦被定义和接受,就必须保持不变,以保护为使用该接口而编写的应用程序。接口发布后,就不能对其进行更改。这是我们进行组件设计的一个重要原则,叫做‘接口不变性’。”
我点了点头:“接口不变性,这个我可以理解了。”
“我已经反反复复强调过,创建一个接口就是在创建一个定义,接口定义发布后则永远不能更改。接口不变性,就是为了保护为使用接口而编写的现有系统。当接口设计与需求有所出入,确认需要大幅度变更时,我们应该创建新的接口。一般命名方式是,新接口可以通过在原来的接口名称后追加一个数字‘2’来命名,以显示出它与现有接口的关系。然后通过接口继承来创建新接口。”
  “可是,如果需求分析得不好,岂不是会出现一大堆的派生接口了?”我不免有点顾虑。
“这是肯定的,而且过于频繁地生成新接口,会因未使用的接口实现而使组件变得很庞大。有经验的设计师,在充分分析需求后,设计出的接口往往很小且相互独立,减少了性能问题发生的可能。”
“这种分解能力倒真的是艺术呀!”我不禁为之叹服。
“当然,一般来说,我们会把确定哪些属性和方法属于接口的设计过程称为‘接口分解’。基本准则是,应在一个接口中将紧密相关的几个功能聚合为一组。功能太多会使接口不便于运行,而过于细分功能将导致额外的系统开销并降低使用的简易性。掌握分解的这个度的能力是需要不断的在技术上进行磨炼,以及在对每个项目深入分析与理解的基础上才能得到的。”
“明白了。”我大声地回答着,真希望自己能早一天成为接口设计大师。
大李笑着拍了拍我:“明白了就好。其实,与设计接口相比,创建大的实现继承树更容易出错。”
“当然,”我脑海里浮现起实现继承的各个环节,“这是不是说,在某些时候适当使用接口还是很有益的。”
“看来你真的明白了,那你再来说一下,接口与类实现继承相比,好处有什么?”大李回过身开始找茶杯。
我低下头,努力地转动了一下脑子:“我试着说一下吧,总体而言,接口是一种非常有效的编程方法,它让对象的定义与实现分离,从而可以在不破坏现有应用程序的情况下使对象得以完善与进化。接口消除了实现继承的一个大问题,就是在对设计实施后再对其进行更改时很可能对代码产生破坏。即使实现继承允许类从基类继承实现,在类首次发布时仍然会使我们不得不为设计做很多的抉择。如果原有的设想不正确,并非总可以在以后的版本中对代码进行安全的更改。比如,我们定义了一个基类的方法,它需要一个 Integer 参数,而后来又确定该参数应该为 Long 数据类型。我们无法安全更改原始类,因为为从原始类派生的类所设计的应用程序可能无法进行正确编译。这一问题会扩大化,因为单个基类会影响几百个子类。”
“那用重载原始类并采用一个Long类型的参数,不就能解决这个问题了吗?”大李提了个问题。
“这个么?”我想了一下,“可是,这样不一定能达到满意的效果,因为一个派生类可能需要对采用整数的方法进行重写,如果取 Long 数据类型的方法不能被重写,该派生类可能无法正常运行。”
“那用接口怎么做?”大李不依不挠地继续问。
“办法就是发布接受新数据类型的更新接口。”我一下子就回答出来了。
“看来你已经掌握了接口操作的基本环节了。”大李的评语真让我高兴。“我再帮你总结一下, 使用接口继承而不用类继承的主要原因有:在应用程序要求很多可能不相关的对象类型以提供某种功能的情况下,用接口适用性会更强;接口比基类更灵活,因为可以定义单个实现来实现多个接口;在无需从基类继承实现的情况下,接口更好;在无法使用类继承的情况下接口是很有用的。例如,结构无法从类继承,但它们可以实现接口。”
我抿着嘴用力点了点头,同时在心里默默地记忆着大李所说的每一条准则。
“回去好好想想,多写几个小程序来练习一下,明天我们还要欣赏 VB.NET 提供的强大的可视继承的表现呢。”
(未完待续)
---------------------------------------------------------------
声明:本文版权与解释权归韩睿所有,如需转载,请保留完整的内容及此声明。
QQ: 18349592
jeecg-boot getDictItemsByTable接口存在SQL注入漏洞CVE-2024-48307 微信公众号搜索:南风漏洞复现文库该文章 南风漏洞复现文库 公众号首发JeecgBoot 是一款开源的的低代码开发平台。 阅读详情

相关推荐

基于深度强化学习的无地图移动机器人导航:让机器人在未知环境中智能前行

虽然仍然面临sim-to-real差距、安全性保证等挑战,但随着算法的不断改进和计算能力的提升,基于DRL的无地图导航技术将在服务机器人、工业自动化、太空探索等领域发挥越来越重要的作用,为人类生产和生活带来更大便利和价值。对于复杂环境下的动态目标导航问题,研究人员提出了多智能体协同控制算法(如Teamwork-Net算法),通过多个智能体分别控制机器人的运动速度与运动方向,协同实现更高效、更稳定的导航性能。深度强化学习结合了深度学习的感知能力和强化学习的决策能力,非常适合解决无地图导航问题。

weixin_45131592的博客 902

Henry的VB.NET之旅(十)—何时用接口

?????? Henry的VB.NET之旅(十)—何时用接口??????????????????????????????????????? 韩睿?大李没告诉我接口与抽象类的区别,什么时候用接口,什么时候用实现继承。弄得我中饭也没吃好,老在琢磨这事,这不,一吃完饭,我就冲上楼,一个房间一个房间转,到处找大李。过了好一阵,这老哥才和几个同事说说笑笑地回到办公室,我立即走上前,半请半拉地把他

韩睿(Henry Han)的专栏 5859

避坑指南:SAP CO模块维护成本控制范围的5个常见错误及解决方法

本文深入剖析了SAP CO模块中维护成本控制范围时最易犯的5个常见错误,包括货币参数配置不当、标准层次结构缺失、财政年度变式不一致、功能激活遗漏及集成参数设置错误。重点针对事务码OKKP的配置,提供了详细的排查步骤与实战解决方案,帮助顾问有效规避陷阱,确保成本核算体系稳定运行。

stone的博客 233

VB接口的使用方法

【接口定义】接口就是指只包含虚成员的虚类。 (1)虚类,表明了接口是不能够被直接实例化的。也就是说,接口只是一个抽象概念。比如我们说车可以跑,人可以跑,马可以跑。我们可以看到实例化的车、人、马。但是我们可以定义一个“会跑的物质”。它可以是车,也可以使人、马,但是我们却不能说“这个东西就是一个会跑得物质,但是它并不是车、人或者马。” (2)只包含虚成员,表明了接口只是说明了它具有什么样的功能,可

没有伞的孩子必须努力奔跑!—小林 5370

CTF密码学奇技淫巧:当Base64遇到ROT13与Atbash

本文深入解析CTF竞赛中Base64、ROT13与Atbash的复合编码技术,提供Python实现与CyberChef可视化处理方案,帮助选手掌握密码学题目的解题技巧。通过NewStarCTF2025实战案例,对比脚本化与可视化工具的优劣,提升Web安全竞赛中的编码处理能力。

weixin_29001683的博客 508

完整IC设计流程解析&Makefile学习

本文介绍了decorder38项目的文件结构、自动化综合流程和Makefile使用方法。项目包含RTL到GDSII全流程文件,重点关注syn目录中的综合脚本。通过make dc命令运行综合流程,生成网表、约束和时序文件。关键报告如qor.rpt、area.rpt和min_vio.rpt用于分析综合质量、面积和时序。Makefile部分解释了其基本语法、IC设计中的典型结构,包括目标定义、命令执行和特殊声明,强调了其在自动化构建和依赖管理中的重要性。

m0_63352623的博客 855

VB.NET 接口的作用----本人现阶段的理解

在用"三层架构"思想做机房收费系统的时候,感觉最经典的三层架构图就是下面这个图了。 你有没有发现按照上面这副图做的话,BLL层跟DAL层联系太紧密了,这样实现的系统,就相当于把数据库写死了,想更换别的数据库可不是件简单的事,于是我们就想到了要在DAL层加上接口+"抽象工厂设计模式"。于是就出现了下面这副图 在这里谈谈我理解的接口所具有的作用,说的不对的地方,还请高手指...

duoerbasilu 548

chipseeker Y叔

这一次讲解非常重要的peak注释,注释在ChIPseeker里只需要用到一个函数annotatePeak,它可以满足大家各方面的需求。 输入 当然需要我们上次讲到的BED文件,ChIPseeker自带了5个BED文件,用getSampleFiles()可以拿到文件的全路径,它返回的是个named list,我这里取第4个文件来演示。annotatePeak的输入也可以是GRanges对象,你如果用R做peak calling的话,直接就可以衔接上ChIPseeker了。 require(ChIPseeke

生信小博士的博客 1589

何时使用抽象类和接口

抽象类 抽象类是一个声明为abstract的类 - 它可能包含也可能不包含抽象方法。抽象类无法实例化,但可以进行子类化。抽象类可以具有静态字段和静态方法。当抽象类被子类化时,子类通常为其父类中的所有抽象方法提供实现。但是,如果没有,那么子类也必须声明为abstract。 抽象方法是一种在没有实现的情况下声明的方法(没有大括号,后跟分号),如下所示: 如果这些语句适用于您...

QA_test123456的博客 171

接口自动化测试如何做?测试老鸟总结,接口测试数据构造大全......

接口参数的数据获取:接口文档:接口文档通常会包含接口需要的请求参数和返回结果的格式、类型等信息;测试用例设计:根据测试用例设计的需求,可以确定需要哪些请求参数以及期望的响应结果;业务数据:从实际业务场景中获取数据,以确保测试数据的真实性和代表性;数据库:从数据库中获取数据,作为接口测试的输入参数;随机数据生成器:通过随机数据生成器生成测试数据,以增加测试用例的多样性和覆盖率。在选择数据来源时,需要根据具体情况进行选择。如果有可靠的接口文档,可以直接从文档中获取请求参数和预期结果;

798

华为OD机试真题 新系统 2026-04-19 Java&Go 实现【分辨率排序】

华为OD机试真题 新系统 2026-04-19 Python&JS 实现【分辨率排序】

MISAYAONE的博客 303

何时使用委托而不使用接口

委托和接口都允许类设计器分离类型声明和实现。任何类或结构都能继承和实现给定的接口。可以为任何类上的方法创建委托,前提是该方法符合委托的方法签名。接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。既然存在这些相似性,那么类设计器何时应使用委托,何时又该使用接口呢? 在以下情况下,请使用委托: 当使用事件设计模式时。 当封装静态方法可取时。 ...

weixin_30881367的博客 131

【Ubuntu】RK3576 Linux 6.10 Ubuntu 22.04 系统中 HUSB311 Type-C 转 DP 显示输出与 Device/OTG 模式切换配置详解

本文详细介绍了在Rockchip RK3576开发板(Linux Kernel 6.10+Ubuntu 22.04)上配置HUSB311 Type-C控制器的设备树实现方案。主要内容包括:1)硬件连接与模块组成;2)设备树完整配置,涵盖Type-C供电、USB OTG/Host模式、DP显示输出等关键功能;3)软件配置步骤与常见问题排查方法。该方案实现了Type-C接口的DisplayPort AltMode显示输出、USB Device/Host模式自动切换等功能,为嵌入式系统Type-C接口开发提供参考

qq_34478161的博客 808

何时使用Delegate,何时使用Interface

委托和接口的相似点 委托和接口都允许类的设计者将声明和实现分离开来,一个给定的接口可以被任何类或结构体继承和实现;也可以为任何类的方法创建对应的委托,只要该方法满足委托的签名,委托和接口可以被一个对象使用,这个对象不必关心实现委托和接口的细节,有了这些相似点,我么什么时候使用委托?什么时候使用接口呢? 使用委托的情况 使用了基于事件的设计模式 封装静态方法 调用者无需访问实现方法的对...

weixin_30500289的博客 74

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【转载】APP接口开发的一些经验

转载:新起点 http://www.cnblogs.com/net515/p/5931392.html APP数据接口开发的一些经验 刚接到这样的任务时,没有感觉到任何压力,不就是给移动端应用提供数据吗?那边发来参数,这边处理数据,返回JSON。做网站开发时经常使用ajax请求后台数据,不就是这么回事吗。于是,在确认完需求后就开始干了,很快,进入联调阶段,这个时候各种问题来了,忙得不可...

weixin_30662849的博客 78

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

何时使用Delegate或接口

在以下情况下使用Delegates很有用: 调用一个单一方法; 一个类要进行方法规范(method specification)的多种执行; 使用一个静态方法来执行规范; 想获得类似事件设计的模式; 调用者没有必要知道或获得方法定义的对象; 执行的提供者想将规范的执行“分发(hand out)”成一些可供选择的部分; 代码需要进行简单的组成部分。 接口在以下情况会很有用: ...

weixin_34258838的博客 199

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

关于何时用继承何时用组合

没有找到极其强烈无法辩驳的用继承的原因的时候一律用组合 组合体现为实现层面,继承主要体现在扩展方面 我觉得如果并不是需要一个类的所有东西(包括接口和属性),那么就不需要用继承,相反就用组合。 用继承那就必须是所有的都继承,不是所有的都继承,那么就是滥用继承。 组合在编译依赖和不同版本的运行时兼容性上优于继承;继承在合理复用实现的潜力优于组合 继承偏重集体,具有特殊性的集...

weixin_30532987的博客 166

C++中抽象类与接口的区别

一、抽象类和接口 抽象类: 抽象类是特殊的类,不能被实例化(将定义了纯虚函数的类称为抽象类);除此以外,具有类的其他特性; 重要的是抽象类可以包括抽象方法,这是普通类所不能的,但同时也能包括普通的方法。 抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。 另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。 虽然不能定义抽象类...

奔涌的后浪的专栏 4610

[转]何时使用委托而不使用接口(C# 编程指南)

以下内容转自MSDN:http://msdn.microsoft.com/zh-cn/library/ms173173.aspx 委托和接口都允许类设计器分离类型声明和实现。 任何类或结构都能继承和实现给定的接口。 可以为任何类上的方法创建委托,前提是该方法符合委托的方法签名。 接口引用或委托可由不了解实现该接口或委托方法的类的对象使用。 既然存在这些相似性,那么类设计器何时应使用委托,何时...

weixin_30877181的博客 61

2025年Web自动化测试工具全景选型指南:从Selenium到AI驱动

Web自动化测试是通过程序模拟用户操作浏览器,验证Web应用功能正确性的技术。其核心原理是驱动浏览器执行点击、输入等动作,并断言页面状态。在工程实践中,它能显著提升回归效率、降低人工成本,广泛应用于持续集成、跨浏览器兼容性验证等场景。随着技术演进,工具已从Selenium的协议驱动,发展到Playwright的运行时驱动,再到如今AI与Coding Agent驱动的智能测试。面对playwright使用教程、AI自动化测试等高频搜索需求,开发者需建立场景化选型框架。本文系统梳理20个主流工具,助你精准匹配团

weixin_33795806的博客 194

何时使用抽象类或接口

假设你设计了一个接口供程序使用,现在想给这个接口增加一个新的成员.这时你面临两个糟糕的选择:一是改变已有的接口,破坏针对原接口编写的已有代码;二是将接口看作是不可改变的.另外创建如IStore2 或IstrageExtended之类的接口。但如果你经常这样做的话,很快就会得到一大批相互紧密关联的接口. 而如果采用抽象基类的话只要添加一个virtual方法就可以。 结论: 如果要创建...

weixin_30559481的博客 67

何时用继承,何时用组合

何时用继承,何时用组合? 下面两条内容,可以告诉我们如何在继承与组合之间做出选择: 如果存在一个“是”的关系,并且一个类要对另一个类公开所有的接口,那么继承是更好的选择 如果存在一个“有”的关系,那么首选组合。 http://www.cnblogs.com/liushuijinger/p/3900429.html 转载于:https://www.cnblogs.com/softid...

weixin_34179968的博客 91

何时使用抽象类?何时使用接口?

https://www.jianshu.com/p/28e3b4d61945 转载于:https://www.cnblogs.com/b6952/p/10524038.html

weixin_34146986的博客 170
上一篇: 今天啥都没干,用visio画了一天用例图
下一篇: 小试存储过程
JYYCOM
博客等级 码龄20年 9粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值