“派生”的前言 心已赠人 2022-09-30 13:56 17阅读 0赞 前一篇,是[《封装》的尾巴(点我)][Link 1],这一篇,是《派生》的前奏……(突然有一种七八月份的感觉) 8.1. 派生 类型和类型之间可以有很多关系,其中“派生”是最重要和最基础的一种关系。这里有一道小学语文题。 〖轻松一刻〗:做小学题,学类型的派生关系 请照着1和2中三个词语的关系,从A、B、C、D中选出一个你认为合适的词填在划线处: 1) 人类、白种人、黄种人; 2) 交通工具、小汽车、飞机; 3) 电脑、台式机、\_\_\_\_\_ 备选答案:A)樟脑;B) 硬盘、C)拖拉机、D)笔记本。 除非你坚决认为我说的“笔记本”是纸簿,否则你应该不会选错。这就是“派生”的基本概念:B类型是一种特定的A类型。比如:“白种人是一种特定的人类”,或者“飞机是一种特定的交通工具”。此时可称B为“派生类”,A为“基类”,描述为:A类派生出B类,或者B类继承自A类。 你需要能够看得懂以下关系图: ![派生关系][112600_12729654230iRC.png] 请注意箭头的方向:由派生类指向基类,这是当前软件设计界流行的表示法。用C++的语法,可以表达为: Code: 1. class Transportation //交通工具类 2. \{ 3. ... 4. \}; 5. 6. class Car : public Transportation //小汽车是交通工具的派生类 7. \{ 8. ... 9. \}; 10. 11. class Airplane : public Transportation //飞机是交通工具的派生类 12. \{ 13. \}; 先不必太关心语法,只要能看出上面有三个,而不是一个class即可。但有读者马上要问了:真的需要把“Car”和“Airplane”全部设计为class吗?为什么它们不可以就是“交通工具”这个类的两个变量?示意为如下代码: Code: 1. class Transportation //交通工具类 2. \{ 3. ... 4. \}; 5. 6. Transportation aCar; //一辆小汽车 7. Transportation aPlane; //一架飞机 这种思路是:我设计了一个超强的“交通工具类”,它同时具备小汽车和飞机应用的功能,然后当需要时,我希望它是小汽车,它就是小汽车,希望它是飞机,它就是飞机。必须承认,前几年我坐某航空公司的飞机到北京,飞机降落机场时找不到停机位,于是庞大的铁鸟在首都机场上四处乱逛,当时我是感觉自己正坐在大巴士上……但这是错觉!现实中要设计生产一种既可以在市区像QQ车一样四处钻,又可以腾空而飞的玩意儿,怎么可能呢? (有同学不服气:人家美国的变型金刚就是这样子的……) 这就是学习“派生”之后,你经常要向自己问的一个重要问题:你真的需要一个派生类吗?比如足球有真皮做的,也有塑胶做的,那么我们需要“足球(基类)”、“皮足球”和“塑胶足球”三个类吗? 别轻易说“要”或“不要”……复习一下“什么是封装”?封装一个类,既需要考虑事物内部的本质不变式,还需要考虑它的使用者是谁。 对于卖体育用品的商店,或者对于买家,通常是不需要将“皮足球”和“塑胶足球”分别定义成一个类。“皮”或“塑胶”只是足球一个属性:材料,我们可以用一个枚举来作简单区分。 Code: 1. enum Material \{ leather, plastic\}; 2. 3. class Football//一个为买卖设计的足球类 4. \{ 5. public: 6. Football(Meterial m); 7. Meterial GetMeterial () const \{ return \_meterial; \} 8. 9. double GetPrice() const \{ return \_price; \} 10. void SetPrice(double price); 11. private: 12. Meterial \_meterial; 13. double \_price; 14. \}; 足球当然还有其它属性,比如尺寸或颜色等等,都非常适于像这里的“价格”及“材料”一样,被仅仅当成足球的属性看待(设计为一个类的不同成员)。 对于足球的产家就不同了,他需要关心一个足球如何生产出来,所以可能会为Football类添加“制作”、“质检”等等和生产相关函数,而“皮球”和“塑胶球”在这些操作上,可能天差地别,这时分拆成三个类就非常自然: Code: 1. class Football 2. \{ 3. public: 4. Football(); 5. 6. void Make(); 7. void QualityTest(); 8. \}; 9. 10. class LeatherFootball : public Football 11. \{ 12. public: 13. LeatherFootball(); 14. 15. void Make(); //皮足球有自己的Make函数 16. void QualityTest(); //皮足球有自己的QualityTest函数 17. \}; 18. 19. class PlasticFootball : public Football 20. \{ 21. public: 22. PlasticFootball(); 23. 24. void Make(); //塑胶足球有自己的Make函数 25. void QualityTest(); //塑胶足球有自己的QualityTest函数 26. \}; 这就回到了“飞机”与“小汽车”无法合二为一的情况了,工厂无法在同一条生产线同时生产真皮球和塑胶球,负责塑胶球的质检员,最好不要同时也负责真皮球的质检(当然,当然,我知道资本家可能不这么想)。当使用者是厂家时,足球class就和前面为买卖过程所做的设计大有不同:此时我们希望不同材质的球可以拥有自己的Make函数,从而可以避免去写一个超强的,必然也是超复杂的,无所不能的Make或QualityTest函数。 〖危险〗: 不要迷恋“变形金刚”,那只是童年一个梦…… 每个C++程序员懂得“类”是要设计的……于是乎有些人设计设计再设计,代码里就出现一个“变形金刚”类。原来他们把所有逻辑全写到一个函数或一个类里面(变形金刚),然后通过各种开关,各种复杂的逻辑,去区分这个类什么时候是一个机器人,什么时候又是一只汽车…… 其实,真正的设计,首先是懂得“拆分”,派生是拆分的方法之一。 当然,也要反复不管三七二十一,对象稍有区别,就被设计成两个类,这是一种“过度设计”。但对于初学者,有时候只是懒惰造就了一个个庞然大物——却振振有辞:我在设计一个伟大的变形金刚,请不要拿那种无趣的规则制约我的创造力! 醒醒噢,我们写的是代码,而不是科幻小说,请不要把代码写成一份无人理解的寂寞。 最后提一个问题:足球的尺寸,通常只需要做为一个属性设计,请读者思考什么情况下,足球的尺寸也会造成专门设计一个派生类才更合适? 如果您想与我交流,请点击如下链接成为我的好友: [http://student.csdn.net/invite.php?u=112600&c=f635b3cf130f350c][http_student.csdn.net_invite.php_u_112600_c_f635b3cf130f350c] [Link 1]: http://student.csdn.net/space.php?uid=112600&do=blog&id=32442 [112600_12729654230iRC.png]: /images/20220705/c8d2713bd888453e8d6007f85af962ff.png [http_student.csdn.net_invite.php_u_112600_c_f635b3cf130f350c]: http://student.csdn.net/link.php?url=http://student.csdn.net%2Flink.php%3Furl%3Dhttp%3A%2F%2Fstudent.csdn.net%252Finvite.php%253Fu%253D112600%2526amp%253Bc%253Df635b3cf130f350c
相关 前言 本专栏将会持续更新java初级和中级知识体系 方便学习自学者建立健全的Java知识体系 方便有基础者回顾java体系知识 专栏目录 [1.java基础][1.java] 布满荆棘的人生/ 2024年04月02日 04:08/ 0 赞/ 105 阅读
相关 前言 写这个专栏的目的是为了分享自己的经验,希望可以帮助更多在学习Java的道路上迷茫的小伙伴。 因为博主也是从一知半解到逐渐熟悉,这一路上,有很多的朋友同事锦囊相授,在此 - 日理万妓/ 2023年02月20日 07:36/ 0 赞/ 46 阅读
相关 前言 Hello, I'm Shendi -------------------- 有一段时间没发案例了 这次准备着手写一个专栏,对于之前写的一些案例(贪吃蛇,中国象棋,五子棋 朴灿烈づ我的快乐病毒、/ 2023年01月02日 06:27/ 0 赞/ 178 阅读
相关 “派生”的前言 前一篇,是[《封装》的尾巴(点我)][Link 1],这一篇,是《派生》的前奏……(突然有一种七八月份的感觉) 8.1. 派生 心已赠人/ 2022年09月30日 13:56/ 0 赞/ 18 阅读
相关 前言 因为本人工作繁忙,多半不能解答您的具体的技术问题(包括发私信或邮件),请大家多谅解。 本博客所有内容及信息,均为作者个人观点,并不代表欧特克软件有限公司(Autodesk,I ╰半橙微兮°/ 2022年06月12日 04:55/ 0 赞/ 199 阅读
相关 前言 2017.5 现在已近在Java开发工作中沉浸了半年,算上学习的时间,零零散散也有快两年了,所以也准备写写博客,这里将博客的格式稍微规定一下,以后就按照此格式进行博客编 你的名字/ 2022年06月08日 00:21/ 0 赞/ 210 阅读
相关 前言 ![挥霍时间][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0 忘是亡心i/ 2022年04月04日 14:22/ 0 赞/ 279 阅读
相关 前言 最近在看《谁的青春不迷茫》,内容很让我动容,虽然之前听朋友对刘同的评价不太好,然而我看东西是不大带有偏见的。用文笔把青春奋斗的十年写下来,给自己也给别人。这样真的很好。我喜欢 爱被打了一巴掌/ 2022年01月11日 04:29/ 0 赞/ 271 阅读
相关 前言 由于自己的基础相对很差,所以需要找一本基础书籍好好的看一遍。就选这本啦,尽快看完。 ![2789632-94bdd46613a775b9.png][] [278 Love The Way You Lie/ 2021年06月24日 16:11/ 0 赞/ 493 阅读
相关 前言 为什么学linux? 一方面,.net都跨平台了,了解下免费的linux。 另一方面,希望对操作系统有更多的了解,扩展知识面。 之后可能会遇到使用linux系统,当然 逃离我推掉我的手/ 2021年06月24日 16:11/ 0 赞/ 443 阅读
还没有评论,来说两句吧...