2021年9月11日

ut美女咪咪神熊猫凌_C++编程知识解析:如何理解面向对象中,对象与对象的关系?

作者 adminer
我上学的时候,谈到设计模式是个有格调的话题,设计模式似乎是解决软件开发的精髓,但是很长一段时间,我从骨子里拒绝了设计模式。我觉得自己连面向对方的知识都没有理解,所以谈到设计模式时尚很早,我特别拒绝了爆炸性的“大话设计模式”。那个设计模式看起来用形象的比喻理解了什么,其实你真的开始写代码的时候,ut美女咪咪神熊猫凌发现自己什么也写不出来。

这位博客想退一步思考,总结面向对方的知识,如“对方和对方的关系”。

和大部分人一样,初学面向对象的时候,都会铺天盖地地听到一些词汇,比如“面向对象的三大特性是继承,封装,多态。”,再比如一切都是对象。但如果你仅仅记住这几句话,真的很难领悟面向对象这件事。我记得自己真正的面向对象是读了《c的编程思想》,这本书的第一章介绍了oop,作者通过面向过程的c代码向c的oop写作方式,引出了面向对象的精髓。例如,面向对象实际上是一种思想,早期使用c的时候,也可以用面向对象的想法写(struct函数),但是这个代码是单向绑定的,支持面向对象的代码的优点是完成方法和数据的双向绑定。不像struct那样,不知道谁使用了这个数据结构。

这些关于包装的知识理论被称为基于对象,但实际上,对于很多人来说,在系统中用包装的思想建模系统并不容易。这可能听起来有点夸张,但仔细考虑一下,对于一个人、苹果、订单来说,建模很容易,但是Controller、Action、Execute这些看起来像是动作对象吗?

比如复杂的系统,如何抽象领域模型,使系统清晰地交流并不容易。继承和多态,其实继承本身和多态不是同一平行线的概念。这个继承,java实际上分为继承界面和继承类,继承类主要是为了代码的再利用,但是这个再利用是静态的,多利用就像动态的再利用。

c的分类,c提供的oop看起来像是为数学公式准备的,只有继承类,只有函数类别另外,c的继承包括公有继承、继承、私有继承等继承权、友元和多重继承。这些东西不是没用的,而是普通人不能用的,所以java选择了简化。

面向对象本身的编程思想可以总结为

(1)所有数据都应该隐藏在所有类别的内部。

(2)类用户必须依赖类公共接口,但类不能依赖其用户。

(3)不要把实现细节放在类别的公共接口上。

(4)面向对象的方法签字实际上是信息协议,面向对象的本质是在对象和对象之间发送信息。

完成上述oop回顾介绍后,引进该博客的主要内容,对象与对象之间的关系。

使用关系 简单来说,我就是这样理解面向对象,每个对象都包装了自己的状态和协议,一个对象总是想要另一个对象。总结了一个对象如何使用另一个对象的方法,基本上总结了对象建模的所有场景。

我非常喜欢用汽车和加油站之间的关系举这个例子。这个例子是我从《OOD启示录》这本书中读到的。

汽车如何使用加油站?

首先作为参数可以传递给加油站:

ClassCar{voidget_gasoline(Gasstiongasstation);}
或者作为Car的属性,这看起来有点奇怪,ut美女咪咪神熊猫凌但这辆车只能在指定的地方加油。

ClassCar{privateGasStationgasStation;voidget_gasoline(){gasStation...}
更奇怪的是土豪模式,直接new加油站出来。

classcar{voidget_gasoline({gasstation==newgasstation()}
另一种退出方式是从另一个地图对象中获得加油站对象,但这又引起了另一个问题。这个地图对象是从哪里来的?

classcar{voidget_gasoline(){gasstation=map.getgasstation()}
以上的这些都是一个对象想使用另一个对象的方法,我特别注意那个属性的方法,同样定义一个属性。例如,person具有一个属性,那就是一个属性,即使是相关的属性,也包括相关的属性。不过更官方的叫法,其实将对象与对象的关系分为四种:依赖关系(Dependency),关联关系(Association),聚合关系(Aggregation),组合关系(Compostion)。其中,将其作为局部变量、方法参数或调用一种静态方法称为依赖关系。而关联关系,聚合关系,组合关系,都用成员变量的方式表现,但是它们所表达的对象生命周期和耦合度是不一样的。

继承 不仅可以使用对象,还可以通过继承获得这个“代码”前面提到了,多态是动态的获得,而继承更像是静态的获得,就好像编译器把这份代码给你拷贝过去了一样。设计模式的书常常把继承说的一文不值,说“用组合不用继承”,但如果两个类真有某种父子关系,使用组合而不是继承看上去是很怪的,而且维护性也很差,比如你子类继承了你的父类,那只要给父类添加一个方法,那子类是默认就获得了,但是如果你使用了组合,你就不能方便的拥有这些方法,ut美女咪咪神熊猫凌要一个个的子类去引用这个新的实现。

多重继承

提到继承就不得不提到多重继承,这个东西在java这种语言中被禁用了,很多人说java可以实现多个接口,但是接口和继承类完全不是一个概念,继承类是重用,那接口有能啥重用的地方?充其量是定义协议而已。多重继承这种思想本身没有问题。例如,ut美女咪咪神熊猫凌木门继承了门和木两个父亲。这样,任何父亲添加新的属性和方法,都会默认地被木门继承,这是自然的建模。木门有门和木两种属性,这很奇怪。多重继承受到谴责的主要是那种钻石继承,父亲之间签字相同等问题,但也有提供限制版多重继承的语言,使用多重继承,ut美女咪咪神熊猫凌不提高代码的复杂性。例如Mixin(混合类)。

元类 最后说元类,这个概念来源于元编程,元编程是什么比如DSL,比如c 中的模板,元类呢就算是用来创建类的类。这个在python中偶尔使用。简单的入门可以用type制作对象(type是元类)。

Foo=type(&#34Foo&#34(object,),{&#34hello&#34:hello})

很多使用场景都是设置类的__metaclass_属性,ut七月甜美女神在创建这种类型时扩大这种类型。

今天的共享来到这里,希望对大家有所帮助~

不知道就问。对于准备学习编程的合作伙伴,如果想更好地提高编程的核心能力(内功),请从现在开始

编程学习书籍共享:

编程学习视频共享:

编程学习视频共享(多年学习的源代码、项目实战视频、项目笔记、基础入门教程)

对C/C本感兴趣的是,关注编辑在后台的私人信件。【编程交流】一起学习吧可以接受C/C的项目学习视频资料哦已设置关键词自动回复,自动接收即可!