多重继承、接口的优缺点分别是什么?Delphi为什么选择接口?

ooolinux 2022-11-10 19:22:42

如题

...全文
181 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
YiYanXiYin 2022-11-23
  • 打赏
  • 举报
回复

主要是风险规避, delphi , java之类的语言更易用就在于给开发人员规避了一些风险, 虽然丧失了一些灵活性,但更好用了
比如说A同时继承B,C但是B,C两个类同时拥有相同原型的两个函数,那么在A实例话时候调用该function时候就可以存在问题,故不提倡类的多重继承,所以多重继承用接口相对安全,可以避免很多因为原型相同在继承时候出现不必要的潜在危险

ooolinux 2022-11-23
  • 举报
回复
@YiYanXiYin 有道理
  • 举报
回复
@YiYanXiYin 这个不是问题,可以通过类前缀来区分继承来的同名同型成员,x.B::f()、x.C::f()之类的,连这么基本的名字冲突都解决不了的话,多重继承就不会出现
  • 打赏
  • 举报
回复

@ooolinux
如果这书说了多重继承的派生类也只有一个VMT(vtable)的话,那肯定是错的。
应该是每个VMT指针在实例中的偏移位置不固定(除了第一个VMT指针和单继承的实例布局一样位于偏移0),不是只有一个VMT。
就我看到,各个C++编译器生成的实例布局都是这样的:
第一个VMT指针
第一个基类的数据
第二个VMT指针 //
第二个基类的数据 //
... // 单继承就没有这些了
派生类自己的数据
另外,派生类新增的虚函数,其函数指针会附加在第一个VMT的后部(和单继承的情况一样)

ooolinux 2022-11-16
  • 举报
回复
@日立奔腾浪潮微软松下联想 应该是这样,我忘记了。VMT中只有虚函数表项吗?普通成员函数偏移地址写在哪里?
  • 举报
回复
@ooolinux 非虚函数的调用不具有多态性,也就不需要用表保存了,直接调用地址,和全局函数的调用一样
ooolinux 2022-11-16
  • 举报
回复
@日立奔腾浪潮微软松下联想 非静态成员函数跟this指针有关,编译器直接算出函数地址?
2条回复
  • 打赏
  • 举报
回复

确实是不同类别的概念,与接口类似的是抽象类。
但是单继承的类架构,通过实现多重接口,可以模拟多重继承,于是两者也就有了联系。
在Delphi中还有一个接口委托实现机制,每个接口可以只实现一次,其他实现该接口的类都可以通过一个实现该接口的对象(实例)来委托实现,就好像自己也把该接口实现了一样。这样可以减少很多代码,而且能够减缓多重继承的类膨胀问题。
D6之前,接口是对应Windows COM接口的架构设计的,但是从D6开始,已经是独立的语言特性。

ooolinux 2022-11-11
  • 举报
回复
@日立奔腾浪潮微软松下联想 多重继承的缺点就是类膨胀吗?从不同路径得到两份基类的共同基类之成员?
  • 举报
回复
@ooolinux 你说的是菱形继承(钻石继承),这个实际上可以通过虚继承来解决,但是也有副作用。即便不是菱形继承,多重继承也会导致类膨胀更快,这是显然的。
tanqth 2022-11-11
  • 举报
回复
@ooolinux 你这个应该是其中的一个关键点。Delphi严格说不支持多重继承,这个应该不是因为技术难度原因,而是考虑到可维护和更清晰的设计因素。
13条回复
墨梅无痕 2022-11-11
  • 打赏
  • 举报
回复

多重继承(我认为你指的是类的多重继承)就好比你从几个师父那里习得武功,堪称绝世高手;但是如果你同时修习《九阳神功》和《九阴真经》,却没有习得《易筋经》,那这两门特性相冲的内功将使你爆体而亡。
接口就很简单、规范、通用,与功能的实现没有关系,优点同时也是缺点,如果你不能掌控接口的参数类型,同样要爆体而亡。
似乎只有C++采用了类的多重继承,而其他语言都选择了接口多重实现,原因无怪乎类的多重继承过于复杂,而接口更易实现。
臆测,Delphi选择接口还与 Windows 的 COM 机制有关。

ooolinux 2022-11-11
  • 举报
回复
@墨梅无痕 “爆体而亡”这个比喻不是很懂,能用简单代码说明一下吗?
tanqth 2022-11-10
  • 打赏
  • 举报
回复

你这两个内容,根本就不能作对比,完全是不同的东西。

ooolinux 2022-11-11
  • 举报
回复
@tanqth 有关系
一、本课题的目的和意义 目的:学生电子作业提交与分析系统的开发是为了解决传统的使用FTP服务器上传作业的作业管理方式下无法防止学生乱上传作业、上传作业到错误文件夹位置中,未能对学生上传作业的大小、类型、上传时间等进行限制,作业成绩不能通过网络公布显示出来等问题。方便学生能及时查看最新作业,和作业成绩,也方便老师能及时批阅和发布作业,为学生和老师节省时间,减小老师的工作量。 意义:学生电子作业提交与分析系统能够满学生完成作业学习知识的要求,同时也能方便老师及时检查学生作业进度以及进行新的作业布置等功能。自适应性使学生不会在学习的旅途中感觉盲目,迷失方向。大大满足了学生学习的个性化,老师工作时效性的双方面的要求。系统合理地使用校园软硬件资源,实现了网络信息化的作业无纸化管理,提升老师的工作效率及作业批改的灵活性,让老师及时了解当前学生的学习状况。 二、课题的国内外开发动态 网络化教育代表了教育改革的一个发展方向,已经成为现代教育的一个特征,并对教育的发展形成新的推动力。通过Internet/Intranet来实现网上作业提交,是现代教育技术的一个具体实现,具有很重要的现实意义。通过网络的了解,已经有不少高等学校已经推出了自己的作业上传系统。但是由于实现技术有限,系统的功能不完善,而且存在很多缺陷。例如:查询不全面、容易导致系统不稳定,数据库缺乏管理,数据缺乏更新,而且容易丢失。由于这些缺点造成用户对系统不信任,于是又回到传统的“拷贝、粘贴”方式。 三、课题的基本内容 学生电子作业提交与分析系统的主要任务是替代传统的书面作业的提交批改方式、实现科学灵活的学生无纸化作业管理,整合校园网的软硬件资源,最大效力的为现代化教学服务。学生电子作业提交与分析系统结构模式为B/S结构模式,以C#为主要的系统开发语言,使用Microsoft Visual Studio 2010与Microsoft SQL Server 2005开发实现。 本系统按功能分为以下几个模块: (1)管理员用户功能模块:要求实现增加课程,学生、教师角色帐号及课程添加更新,用户登录、密码更换等功能。 (2)学生用户功能模块:要求实现新用户注册,用户登录,教师发布的新闻公告查看,个人帐号资料修改,作业提交管理以及用户留言等功能。 (3)教师用户功能模块:要求实现新闻公告及作业信息发布,用户登录,个人帐号资料修改,学生作业批改和对学生留言回复等功能。 四、拟解决的主要问题 学生电子作业提交与分析系统开发的技术难点主要有两个方面:一是业务逻辑的理解;二是数据库逻辑结构的设计。准确理解一个系统的业务逻辑,合理规划设计,开发出适应其应用的应用系统。正确理解实际应用中的业务逻辑需求,解决系统之间模块的科学划分与结构组织,更好更快的开发设计系统。 此外,利用Microsoft SQL server2005建立好关系数据库和建好客户端和服务器之间的连接又是另一个难点。系统开发前,必须要从科学性、安全性、规范性、结构性等各个方面进行考虑,建立良好的数据库,科学分析管理数据。客户端和服务器之间的连接要配置好数据库服务器等。 五、课题设计的实现方案 (1)本系统开发语言的选择 学生电子作业提交与分析系统结构模式为B/S结构模式,以C#为主要的系统开发语言。C#语言是微软公司在2000年7月发布的一种全新切简单、安全、面向对象的程序设计语言。它吸收了C++、Visual Basic、Delphi、Java等语言的优点,体现了当今最新的程序设计技术的功能和精华。C#继承了C语言的语法风格,同时又继承了C++的面向对象特征。不同的是,C#的对象模型已经面向Internet进行了重新设计,使用的是.NET框架的类库;C#不再提供对指针类型的支持,使得程序不能随便访问内存地址空间,从而更加健壮;C#不再支持多重继承,避免了以往的类层次结构中由于多重继承带来的可怕后果。.NET框架为C#提供了一个强大的、易用的、逻辑结构一致的程序设计环境。同时,公共语言运行时为C#程序语言提供了一个托管的运行时黄精,是程序比以往更加稳定、安全。正是因为C#语言有如此多的优点,因此,在系统开发时使用C#作为本系统的开发语言。 (2)本系统开发工具的选择 学生电子作业提交与分析系统前台使用的开发工具是Microsoft Visual Studio 2010。Microsoft Visual Studio 2010创建满足关键性要求的多层次的智能客户端、Web、移动或基于Microsoft Office的应用程序。使用Visual Studio 2010, 专业开发人员能够: 使用改进后的可视化设计工具、编程语言和代码编辑器,享受高效率的开发环境 在统一的开发环境中,开发并调试多层次的服务器应用程序使用集成的可视化数据库设计和报告工具,创建SQL Server 2005解决方案。使用Visual Studio SDK创建可以扩展Visual Studio IDE的工具 Microsoft为单独工作或在小型团队中的专业开发人员提供了两种选择,Visual Studio 2010 Professional Edition和用于Microsoft Office系统的Visual Studio 2010工具。每种版本都在标准版的特性上进行了扩展,包括用于远程服务程序开发和调试、SQL Server2005开发的工具,以及完整的、没有限制的开发环境。正是因为Microsoft Visual Studio 2010有如此多的优点,因此在开发本系统时我把它作为本系统前台的开发工具。 本系统创建、管理数据库使用的工具是SQL Server 2005。Microsoft SQL Server 2005 是一个全面的数据库平台,使用集成的商业智能工具提供了企业级的数据管理。Microsoft SQL Server 2005数据库引擎为关系型数据和结构化数据提供了更安全可靠的存储功能,是程序员可以构建和管理用于业务的高可用和高性能的数据应用程序。 六、研究方法 该毕业设计采用的研究方法主要有文献法和调查法。该毕业设计具体功能的获取过程主要使用文献法和走访调查法,通过网络调查和查阅网络资料来具体确定该软件的功能需求细节;在软件开发过程中,解决技术问题使用的方法是文献法,通过查阅课本、图书馆资料和网络在线文献等,解决在软件开发过程中的技术问题,比如数据库、建模工具的使用、软件测试等。 七、选题的特色及创新点 选题的特色:本毕业设计的开题经过走访调查和文献查阅等多种方式,基本可以与现实的需求相一致,并能体现用所学的知识和计算机技术解决实际问题。 选题的创新点:该选题采用的均是计算机成熟的技术,在计算机技术方面并没有体现创新点,但是通过完成该毕业设计,可以使得自己对计算机软件开发由更深的认识,积极培养自己的创新意识。 八、已查阅的相关文献

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧