继承与组合的选择

咱们一起学C++ 第二百篇:之C++中组合与继承的深入剖析及选择策略 大家好!在C++编程的学习旅程中,我们已经了解了组合和继承这两种重要的代码复用方式。今天,咱们进一步深入探讨它们的细节,特别是在处理成员函数、静态成员函数方面的特点,以及如何在实际编程中选择使用组合还是继承,希望我们一起进步,对C++的理解更上一层楼! 阅读详情

1)          继承与组合是重用对象代码的机制。

2)          关于父子类的初始化,请参考初始化列表

http://blog.youkuaiyun.com/yeming81/archive/2010/06/16/5673560.aspx

3)          不能继承的函数

l       构造函数和析构函数

构造函数与析构函数只负责它所在的那一层上的构建与释放。子类仍然需要自己的构造函数,也需要手动调用父类的自定义构造函数。

l       operator=

理由同上。

 

4)          new/delete是可以被继承的

当在父类定义了new/delete时,如果子类没有重载new/delete,则用父类的。

5)          static函数也是可以继承的,但其不能是virtual的。

public A

{

public:

static int Func(){return 1;}
};

           

         class B:public A

         {

                   

         };

         B::Func(); //可以

 

更多请参考

http://blog.youkuaiyun.com/yeming81/archive/2010/05/31/5637717.aspx

 

6)          组合的需求

l       当需要存在的类功能时,可选择组合或继承。当不想用存在类的接口,而完全使用新类定义的接口时,用组合。

l       当不需要从子类到父类的转换时,考虑用组合。

比如,你只是用vector保存一些数据时,就不需要这种转换。

7)          private/protected继承的需求

l       private继承是实现继承,在一般情况下,用组合可满足需求。但是,当子类需要父类的部分功能时,可考虑用私有继承。

class A

{

public:

void Func1();

void Func2();
};

           

          class B: private A //不写private默认就是私有继承

          {

                public:

                   using A::Func1; //让Func1公有。

          };

l       私有继承时,父子类指针不能进行转换,因为它们没有关系。

A* pA = new B;

l       protected继承的出现只是为了语言的完备性

8)          继承的需求 – 多态

请参考

http://blog.youkuaiyun.com/yeming81/archive/2010/06/16/5673139.aspx

 

9)          父子类之间的转换

l       向上类型转换

从子类到父类的转换是安全的,因为它仅仅是失去一些子类的功能

l       向下类型转换

相反,从父类到子类的转换是非安全的,因为它增加了一些功能

           

       从以上可反映出生活的哲理:失去的比得到的更加容易。

CCC数字钥匙3.0标准解读(22) 介绍设备制造商服务器和车辆制造商服务器之间的通信协议. 阅读详情

相关推荐

配电网故障重构/孤岛划分/故障恢复

程序主要复现《基于GA_BFGS算法的配电网故障恢复性重构研究_郑海广》,采用matlab编程软件实现,依据网络结构和DG供电方式对配电网进行孤岛划分,将含有 DG 的配电网拓扑结构看成一个树,搭建成连通图模型,使得将孤岛的划分变成了求取最小生成树,以网损和开关开断次数作为目标,采用 IEEE33 节点配电网为算例,通过遗传算法寻优计算,从而得到最佳的重构方案。

zhangxd212489的博客 2500

组合与继承改选择谁?

在面向对象编程中,有一条非常经典的设计原则,那就是:组合优于继承,多用组合少用继承。为什么不推荐使用继承?组合相比继承有哪些优势?如何判断该用组合还是继承? 继承是面向对象的四大特性之一,用来表示类之间的 is-a 关系,可以解决代码复用的问题。虽然继承有诸多作用,但继承层次过深、过复杂,也会影响到代码的可维护性。所以,对于是否应该在项目中使用继承,网上有很多争议。很多人觉得继承是一种反模式,应该...

老高的专栏 488

基于OFDM的实时图像传输系统MATLAB仿真:MPSK与MQAM调制性能对比与误码率分析

本文详细介绍了基于OFDM的实时图像传输系统在MATLAB中的仿真实现,重点对比了MPSK与MQAM调制方式的性能差异与误码率分析。通过搭建OFDM系统模型,探讨了QPSK和16QAM在不同信道条件下的表现,包括频谱效率、抗噪能力和误码率等关键指标。文章还提供了MATLAB代码示例和实用技巧,帮助读者快速掌握OFDM图像传输系统的核心算法与优化方法。

weixin_29064009的博客 355

java复用类之组合语法、继承语法;代理、结合使用组合和继承、组合与继承之间选择;protected关键字、向上转型;final数据-空白final和final参数、final方法、final类;

组合语法 组合的方法非常直观:只需在新的类中产生现有类的对象。由于新的类是由现有 类的对象所组成,所以这种方法称为组合。该方法只是复用了现有程序代码的功能,而非它 的形式。 数据初始化的四种方式 1.定义的地方初始化 2.在构造器中初始化 3.实例初始化 4.惰性初始化(用的时候初始化,节省内存资源) 继承语法 Detergent的scrub()方法覆盖了父类Cleanser的scrub()方法,要想使用必须用super.scrub()调用基类的方法 父类private

qq_39268909的博客 230

STM32F429+LAN8720实战:5分钟搞定LWIP裸机网络通讯(附完整代码)

本文详细介绍了如何在STM32F429微控制器上,结合LAN8720 PHY芯片,在裸机环境下快速部署和配置LWIP协议栈以实现网络通讯。内容涵盖硬件RMII接口连接、STM32CubeMX关键配置、代码移植与定制,以及常见问题排查方法,帮助工程师在资源受限的嵌入式系统中高效实现稳定的以太网功能。

2y3u4i5o6p的博客 962

光学防抖OIS介绍与标定

前言:先看一下有无ois系统的效果。 1. OIS系统的作用就是消除镜头的抖动。 Gyro感受方向,Hall感受位移,Actuator驱动马达来矫正抖动方向和位移。 2.ois系统的结构构成 从上面来看ois系统主要有Hall,...

camerall 1万+

Java之组合与继承之间的选择

我们在学习了组合与继承之后,或许我们想要知道这两者之间的区别在哪呢?应用的时候如何进行选择呢?这是我们这篇文章所要讲述的内容。 首先,我们必须要知道,他们是为了对代码进行复用的两种不同方式,我们先来介绍一下二者的概念: 组合:只需在新的类中产生现有类的对象。新的类是由现有类的对象所组成的。 继承:按照现有类的类型来创建新类,无需改变现有类的形式,并且在其中添加新的代码。 区别:组合是显示地允许在新...

qq_41026809的博客 498

Android功耗系列专题理论之十三:MTK平台待机功耗问题分析方法

摘要:本文详细分析了MTK平台待机功耗问题的调试方法,重点介绍了SPM电源管理机制、26M时钟控制逻辑以及系统深睡眠状态的判断标准。文章提供了完整的Debug流程,包括日志抓取、唤醒源分析、SCP睡眠状态检查以及时钟/LDO状态排查等实用技巧,并给出硬件漏电点和软件配置异常的排查方案。针对不同模块(Modem/Conn/SSPM等)提供了具体的电源管理绕过命令,适用于功耗问题调试和低功耗模式验证场景。

560

在组合与继承之间的选择

JAVA中继承与组合如何选择

夏倩倩的博客 661

【100%通过率】华为OD机试真题 Java&Go 实现【查找单入口空闲区域】【2022.11 Q4 新题】

给定一个 m xn 的矩阵,由若干字符 和0构成,X表示该处已被占据,0"表示该处空闲,请找到最大的单入口空闲区域.解释:空闲区域是由连通的O组成的区域,位于边界的0可以构成入口,单入口空闲区域即有目只有一个位于边界的0作为入口的由连通的'O"组成的区域。 如果两个元素在水平或垂直方向相邻,则称它们是“连通”的。

MISAYAONE的博客 2万+

第14.5章 高翔博士最新开源框架Lightning-LM源码解读(五):揭秘位姿图优化核心模块,从数学原理到代码实现

本文介绍了Lightning-LM框架中的位姿图优化(PGO)模块实现。该模块通过融合多源定位信息(激光定位、激光里程计、DR等),构建并优化位姿图来获得更精确的位姿估计。 主要内容包括: 模块概况与数据流程:初始化配置→添加PGO帧→分配位姿→优化求解→更新位姿→滑动窗口 16个核心函数详解:从构造函数到边缘化处理,涵盖完整的PGO工作流程 关键技术点:噪声参数设置、优化问题构建、约束添加、异常值处理等 关键数据结构:帧队列管理、顶点和边构建、优化统计信息收集 该PGO模块采用增量式优化方式,支持多种约束

行知SLAM 1216

C++ 继承与组合的选择指南:从设计原则到实践

优先使用组合:除非能明确论证继承的合理性,否则应该使用组合。这是 GoF 设计模式的核心建议,也是现代 C++ 的最佳实践。组合降低了耦合度,提高了灵活性,且更容易维护。继承用于真正的 Is-A 关系:继承应该严格用于表达类型层次——派生类必须是基类的一种。如果关系不明确,用组合。关键测试:派生类对象是否可以安全地在任何期望基类对象的场合使用(里氏替换原则)。组合用于 Has-A 关系和策略模式:当一个对象包含另一个对象作为其一部分时(如 Car 有 Engine),使用组合。

✨ 欢迎来到【Seal ^_^ 的优快云博客】!✨ 895

置顶必读(1) | 《YOLOv26实战:从入门到深度优化》专栏导读与完整目录导航(持续更新中)

🏆 本文收录于 《YOLOv26实战:从入门到深度优化》 专栏。 本专栏系统梳理并持续复现 YOLOv26 官方特性、核心改进、多任务支持、部署优化与行业落地,内容坚持 持续更新 + 深度拆解 + 工程落地导向,不仅讲“怎么用”,更讲“为什么这样设计、如何真正落地到项目中”。

**My Coding Family** 9万+

组合与继承之间选择

组合和继承都允许在新的类中放置子对象,组合是显示地这样做,而继承则是隐式地做。         组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形。即,在新类中嵌入某个兑现,让其实现所需的功能,但新类的用户看到的只是为新类所定义的接口,而非所嵌入兑现的接口。为取得此效果,需要在新类中嵌入一个现有类的private对象。         在继承的时候,使用某个现有类,并开发一个它的特

Edda.Huang的专栏 293

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Python面向对象:组合与继承的选择策略

《Python面向对象:组合与继承的选择策略》深入探讨了Python编程中组合与继承的核心概念与应用策略。文章从基本定义、技术原理到实践应用,系统讲解了两种设计模式的选择标准与实现方法,包含代码示例和常见问题解决方案。重点分析了组合(has-a关系)与继承(is-a关系)的适用场景,通过类设计案例演示了如何根据业务需求选择合适模式。文中还提供了环境配置指南、进阶示例和错误排查技巧,帮助开发者提升面向对象设计能力,写出更规范高效的Python代码。

未来 95% 的 AI 应用将变得隐形,广泛融入日常生活。 4444

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JAVA中有关组合与继承之间选择的问题

在JAVA中,如何在继承和组合二者当中抉择是一项编程时的难题,通常情况下我们都应尽量避免继承。

ECH00O00的博客 745

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

C++ 多态的进阶应用:抽象类、继承与组合的选择

本文深入探讨了C++多态的进阶应用,重点分析了抽象类与接口继承的特性区别,指出抽象类通过纯虚函数强制派生类实现接口规范。同时对比了继承(is-a关系)与组合(has-a关系)两种代码复用方式的优缺点,强调优先使用组合以降低耦合度。最后提出优秀的设计需要结合抽象类、多态和组合,构建出灵活可扩展的系统架构,遵循开闭原则和合成复用原则,实现代码的高效维护与扩展。

kongsicheng10的博客 807

复用类(3):在组合与继承之间选择、protected关键字、向上转型

在面向对象编程中,生成和使用程序代码最有可能采用的方法就是直接将数据和方法包装进一个类中,并使用该类的对象。也可以运用组合技术使用现有类来开发新的类;而继承技术其实不太常用。因此,尽管在教授OOP过程中我们多次强调继承,但这并不意味着要尽可能使用它。相反,应当慎用这一技术,其使用场合仅限于你确信使用该技术确实有效的情况。到底是该用组合还是用继承,一个最清晰的判断方法就是问一问自己是否需要从新类向基类进行向上转型。如果必须向上转型,则继承是必要的;如果不需要,则应当好好考虑自己是否需要继承。

游王子og的博客 1231

组合与继承之间的选择

组合和继承是允许在新建的类中放入子对象,组合是显示的这样做的,而继承是隐式的做。二者是之间有何区别?或者怎样在二者之间做出选择呢?下面就一起来看看, 组合一般是将现有的类型作为新类型底层实现的一部分来加以复用,在一个类中引用另一个类,而继承是拥有了父类的非私有方法。其中“is-a (是一个)”的关系是用继承来表达的,而“has-a(有一个)”的关系则是用组合来表达的。 组合关系

2343

关于面向对象设计中继承与组合的选择

这个标题似乎有些奇怪,初学者可能会无法理解。先来看看面向对象中组合和继承的基本概念:组合——在某个类中定义了另一个类的实例,对其进行数据维护和操作。继承——某个类从另一个类继承,则自动“拥有”了父类的的数据和方法。可见,在本质上两者是有很大的共性的,就是利用另一个类已有的数据和方法。看看下面的例子——首先,我们来定义一个常见的类Point。public clas

dz_huanbao的专栏 620

组合与继承之间的区别及如何选择

组合与继承之间的区别及如何选择

SimplyJava的专栏 1167

在组合与继承之间选择

    组合是简单的把对象引用至于新类。比如class House{    private Window w=new Window();    private Door d=new Door();}class Window{}class Door{    }    继承是Java语言不可缺少的组成部分。当创建一个类时,总是存在继承(Objec

hanyij的专栏 648

菱形继承和组合与继承的选择。

单继承:一个子类只有一个直接父类的继承关系。 多继承:一个子类有两个或两个以上的直接父类的继承关系。 菱形继承:是多继承的一种特殊情况。 菱形继承问题的具体分析: class Person{ public: string _name; } class Student : public Person{ protected: int _num; } class Tea...

Darling_sheeps的博客 189

理解继承与组合的本质:Qt 项目中的设计选择指南

摘要: 在Qt项目开发中,正确选择继承或组合关系至关重要。继承适用于“is-a”关系(如自定义控件继承父类),组合则适合“has-a/uses-a”场景(如模块间功能调用)。继承易导致高耦合和冗余,而组合更灵活、低耦合。通过“三问法”可快速判断设计方向:若类间无类型层级关系,仅需功能调用,应优先选择组合(如传递QMdiArea*而非继承主窗口)。合理运用二者能提升代码复用性、可维护性和模块化程度。

qq_35803412的博客 1104

Java组合与继承:差异对比及应用场景选择

如果需要增加绘制特殊图形的功能,可以创建一个子类SpecialShapeDrawer继承ShapeDrawer,并重写或添加方法来实现特殊图形的绘制,而不影响原有的调用接口。1. 当存在明显的“is-a”关系时:如动物类Animal有子类猫类Cat和狗类Dog,猫和狗都具有动物的基本特征(如移动、进食等),通过继承可以清晰地表达这种关系,并且复用Animal类的通用方法。• 组合:组合关系中,类之间的耦合度相对较低。• 组合:通过包含其他类的实例,将其他类的功能组合到当前类中,实现代码复用。

jarfg35的博客 525
上一篇: 变量初始化
下一篇: 模板Template
yeming81
博客等级 码龄19年 178粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值