38:通过复合塑膜出has-a或“根据某物实现出”

这篇具有很好参考价值的文章主要介绍了38:通过复合塑膜出has-a或“根据某物实现出”。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

复合(compsosition)是类型之间的一种关系,当某种类型的对象内含它种类型的对象,便是这种关系。

例如:

class Address{/*...*/ };//某人的住址
class PhoneNumber{/*...*/ };
class Person {
public:
    //...
private:
    std::string name;//合成成分物
    Address address;//同上
    PhoneNumber voiceNumber;//同上
    PhoneNumber faxNumber;//同上
};

本例中Person对象由string,Address,PhoneNumber构成。

复合这个术语有许多同义词,包括layering(分层),containment(内含),aggregation(聚合)和embedding(内嵌)。

复合有两个意义。

复合意味has-a(有一个)或is-implemented-in-terms-of(根据某物实现出)。

当复合发生于应用域内的对象之间,表现出has-a的关系,当它发生于实现域内则表现is-implemented-in-terms-of的关系。

比较麻烦的是区分has-a和is-implemented-in-terms-of这两种对象关系。

假设你需要一个template,希望制造出一组class用来表现由不重复对象组成的set。

你的第一个直接是采用标准程序库提供的set template。

不幸的是,set的实现往往招致:每个元素耗用三个指针“的额外开销。因为set通常以平衡查找树实现而成,使它们在查找、安插、移除元素时保证拥有对数时间效率。当速度比空间重要,这是个通情达理的设计,但若你的程序是空间比速度重要呢?

那么标准程序库的set提供给你的是个错误决定下的取舍。似乎你还需写个自己的template。

实现set的方法有很多。其中一种便是在底层采用linked list。而标准程序库刚好有一个list template,于是你决定复用它。

更准确地说,你决定让你自己写的set template继承std::list。也就是让set<T>继承list<T>。

于是声明set template如下:

template<typename T>//将list应用于set,错误做法
class Set: public std::list<T>{/*...*/ };

上述代码是错误的。因为是public继承,所以应该表现is-a关系。但list可以内含重复元素,若数值3051被安插到list<int>两次,则list将内含两笔3051。但Set不可以内含重复元素,若数值3051被安插到lSet<int>两次,则Set将内含一笔3051。因此”Set是一种list“并不为真。

正确的做法是,你应当了解,Set对象可根据一个list对象实现出来:

template<typename T>//将list应用于set,正确做法
class Set{
public:
    bool member(const T& item) const;
    void insert(const T& item);
    void remove(const T& item);
    std::size_t size() const;
private:
    std::list<T> rep;//用来表述Set数据
};

Set成员函数可大量倚赖list及标准程序库其他部分提供的机能来完成,所以其实现很简单,只要你熟悉以STL编写程序。

总结

1.复合的意义与public继承完全不同。

2.在应用域,复合意味has-a。在实现域,复合意味is-implemented-in-terms-of。 文章来源地址https://www.toymoban.com/news/detail-530441.html

到了这里,关于38:通过复合塑膜出has-a或“根据某物实现出”的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 某物小程序sign逆向-记录

    评估了一下,逆向某物小程序要比APP简单,这篇文章主要记录一下小程序的反编译过程和sign的逆向。 小程序逆向的过程(以pc端小程序为例): 找到所需的接口、参数 找到小程序的wxapkg 解密小程序包(有些wxapkg有加密) 反编译小程序 找加密函数(扣js) 测试接口 这个接口

    2024年02月08日
    浏览(34)
  • 某物联网数智化园区行业基于 KubeSphere 的云原生实践

    作为物联网 + 数智化园区一体化解决方案提供商,我们致力于为大中型园区、停车场提供软硬件平台,帮助园区运营者实现数字化、智能化运营。 在使用 K8s 之前我们使用传统的方式部署上线,使用 spug(一款轻量级无 Agent 的自动化运维平台) 自动化在单节点完成代码部署上

    2024年02月09日
    浏览(35)
  • Spring boot easyexcel 实现复合数据导出、按模块导出

    场景: 导出数据为1对多的复合数据 一个模块是一条数据,直接填充数据无法实现 如图: 红框内为一条数据(1对多),下方箭头指向为第二条数据 如果直接填充,只能填充第一条,第二条就没办法了。 由于多行都包含许多,固定表头,只能走填充路线,怎么实现呢 实现思路

    2024年02月07日
    浏览(34)
  • linux通过grep根据关键字查找日志文件上下文

    grep -C 10 keyword catalina.out 显示file文件中匹配keyword字串那行以及上下10行 grep -B 10 keyword catalina.out 显示keyword及前10行 grep -A 10 keyword catalina.out 显示keyword及后10行 grep -C 10 keyword catalina.out aaa.txt grep -o keyword catalina.out | wc -l grep -c keyword catalina.out grep -V

    2024年02月16日
    浏览(38)
  • vue中用echarts实现复合饼图,带关系连接线

    1.拿到产品原型图,需求中有这样一个图表 2.翻看echart的饼图示例,没有这种复合饼图,只有一个嵌套饼图 3. 于是网上查网友的文章,查到两篇类似的贴子,(52条消息) echarts模仿excel复合饼图(饼-饼)_相忘于江湖426543的博客-CSDN博客_echarts复核饼图 和 (52条消息) echarts实现复合

    2024年02月10日
    浏览(37)
  • 文本单词查询复合表达式求值的实现案例分析

            本文讨论的“ 文本单词查询复合表达式求值的实现 ”案例,来自C++ primer第四版,该案例面向对象编程和泛型编程, 涉及类的继承、抽象、多态、句柄、标准IO库、容器、算法库 ,是综合性很强的程序         该程序实现文本中查找单个单词,“非”查询(使

    2024年01月23日
    浏览(26)
  • Java通过Lambda表达式根据指定字段去除重复数据(集合去重)

    这里博主给大家封装好了一个工具类,里面有两个方法。 方法一:可以根据指定字段去除重复数据。 方法二:可以获取到重复的数据。 大家在使用过程中直接拷贝下方代码在要去重的类中调用即可。 导入这个工具类后怎么使用呢?我们接着往下看。 List rstList = list.stream()

    2024年02月16日
    浏览(33)
  • 基于混沌集成决策树的电能质量复合扰动识别(Matlab代码实现)

    💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 2.1 PQDs 信号模型和波形生成 2.2 对电能质量

    2024年02月06日
    浏览(32)
  • 实验一:38译码器的VHDL实现及原理图实现

    找了好多好多,感觉网上都不太人性化,所以自己记录了一下自己写的,还是有点意思的的,但是这前面的没啥意思,到后面连起来用的时候就有意思了! 1、项目的创建 1、File - New Project Wizard 后面没有选择, 一路无脑下来,项目就已经安装好了! 2、两种方法实现38译码器

    2024年02月02日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包