RT,大家看看觉得好可以去下载这本书,真的不错
<1>object oriented approach oop 表现必要的元素
<2>smalltalk特性:
1。万事万物皆对象。
2。程序是成堆的对象,彼此通过消息的传递,请求其他对象进行工作。
3。每个对象都拥有由其他对象所构成的记忆。
4。每个对象皆有其型别(type)。属于同一类型,也就是同一类。type=class
5。同一型别的所有对象接受的消息皆相同。同一类型可以互相处理。
<3>每个对象都有接口。
隶属于同一类的众多对象除了在程序执行期具备不同状态外,其余完全相同。
你可以产生隶属某个型别的变量(oop里表述为对象或者实体,instance),也可以操作这些变量,发送请求或传递消息。
每个类成员members或者元素elements,都共用相同的性质(变量)。例如每个帐户都会有余额,每个出纳都能处理存款动作。
每个类成员根据自身都会有不同的状态。例如每个出纳都有自己的姓名,每个帐户里的余额都不一样。
于是出纳、客户、帐户、交易等等都在电脑中被描述成为独一无二的个体。这个个体便是对象,每个对象都隶属于特定的类,该类定义了对象的特性和行为。
<4>面向对象程序设计就是在建立新的数据型别(data type);
其他理解:type决定了接口(interface),而class则是该接口的一个特定实现品。
由于class描述了“具有共同特性(数据元集)和共同行为(功能)”的一组对象,所有class=data type。
一旦建立class,隶属于该class中的对象,可以产生很多个,操作这些对象,就像他们是存在于待解决问题中的元素一般。
面向对象问题之一,便是在题域内的众多元素与解域内的众多对象之间,建立起一对一的对应。
,对象的接口(interface)定义了它所接受的请求内容,而决定接口的便是type(型别)。
比如点灯泡:
UML设计法
type name(类):light
数据成员data members:省略
interface(成员函数member function):on();
off();
brighten();
dim();
java写法是:
light it=new light();
it.on();
用php的写法是:
$it=new light();
$this->on();
接口interface规范了你能够对对象发出的请求。不过,还是得有程序代码来满足这些请求。这些程序代码加上被隐藏的数据,构成所谓的实现implementation。每一个type都有一些函数对映于任何可能收到的请求。当你对某个对象发出某个请求,某个函数便被唤起,简单说:送出消息(发出请求)至某对象,该对象便知道此一消息的对应目的,进而执行对应的程序代码。
上例中type/class名称是light,对象名是it,能够对light对象发出的请求是:打开,关闭,使它亮些,使它暗些。本例将产生一个light对象的方式是:定义it这个对象名称,并调用new请求产生该种型别的对象。欲发送消息给对象,可以先标示出对象名称,在以点dot运算符连接消息请求。
UML设计图,通常只有class和public member function被列出,而数据成员则省略。
<5>被隐藏的细节:
程序开发人员可分为:开发新数据型别的所谓class创造者,以及在应用程序中使用他人所开发之classes的所谓客户端程序员client programmers。客户端程序员的目标是收集许多可供运用的classes以利快速开发应用程序。class创造者的目标是打造classes,并且只暴露客户端程序员应该知道的事物,隐藏其他事物。
访问权限控管机制,使程序员只能通过interface使用class,而不能使用到class中所有的函数。
客户端程序员不能触及的对象就被称为内部函数,仅供data type内部使用,private和public分离可以做到修改private而不影响public。
让library设计者得以改变class内部运作方式而不担心影响客户端程序。简单说:接口是接口,程序是程序,改变程序,接口照样能用,客户端程序员通过接口使用程序。
java中使用三个关键字来规定class的访问界限:public都可以使用,private除开发者可以在该型别的member function中加以取用,其他人不能访问,如果访问将得到错误信息,protected=private,只不过class继承inheritance者有能力访问protected members,却无法访问private members。
java中还有一种所谓"缺省default"访问权限。当没有使用上述任何一个指定词时,用的就是这种权限,被称为friendly。因为任何一个package中的其他classes,都有能力访问这种所谓的friendly members,但在package之外,这些friendly members形同private members。
<6>重复运用实现码
class开发完毕后一般有一份程序单元unit of code。class具备重复使用,开发者必须要具备丰富的经验和深刻的理解。
重复使用class,最简单的方式是使用其产生的对象,此外可以把某个class置于另一个class内,成为产生一个成员对象。新的classes可由任意数目,任意型别的它种对象组成。这些对象可以任意组合成想要的功能。由于是以“既有的classes组合成新的class”,这种观念被称为组合composition或聚合aggregation。组合通常被成为has-a关系,就像车子‘有’’引擎‘。
UML中用实心菱形指向的表示关系,引擎指向车子,表示车子有引擎,而只划一条线而无菱形表示联系association。
<7>继承:重复运用接口。
UML类图中表示继承的符号是箭号,肩头所指的是父类,指向其的是子类,也就是继承父类的类,可以有多个继承。
原先的class称作base class基类、super class超类,parent class父类。而修改过的复制品则称作derived class、inherited class、sub class或child class子类。父类发生变动,子类也会变。
可以以基类代表系统核心,再衍生其他子类。
垃圾回收机(trash-recycling machine),用来整理散落的垃圾,假设base type基类是垃圾,那么每一袋垃圾都有重量、价值等特性,可被切成丝状、可被熔化或分解。以此为基础,可以衍生出更特殊的垃圾型式,具备额外的特性(例如罐子可能有颜色)或行为(铝罐可压碎、铁罐具有磁性)。此外,他们的某些行为可能不同(例如纸张的价值便和其种类与状态有关)。通过继承,可以建立一个型别阶层体系type hierarchy,表现出想要解决的问题。
几何状图shape
父类shape:
size
color
place
draw()
erase()
move()
getColor()
setColor()
其三个子类:
clrcle square triangle
圆型 正方形 三角形
每种形状都可以拥有额外的特性和行为,因此可以直接以真实世界出发,以代码形式来描述整个系统。
当继承既有的type时,便创造了新type,后者包括前者所有成员(但private私有无法访问),但他复制了base class的接口。也就是说所有可以发送给base class对象的消息,也同样可以发给derived派生衍生 class对象。由于可以通过发送之消息型态来得知对象的type,因此前述事实告诉我们,derived class和base class具有相同的type。因此例子中圆形是一种几何形状,通过继承而发生的型别等价性type equivalenve同等。
base class和derived class有相同的接口,而一定有某些代码伴随着此一接口。当对象收到特定消息时,还是得有程序代码来执行动作。倘若只是继承了class。然后没去做任何事情,那么base class的接口所伴随的函数,便会原封不动的被继承到derived class去。这表示derived class对象不仅拥有与base class对象相同的型别type、也拥有相同的行为,这是无意义的。
两种做法可以产生derived class与base class的差异,第一种做法十分直觉,只要直接再derived class中增加新函数。这些新函数并非base class接口的一部分。这意味着base class无法满足需要,因此加入新函数。但有时base class也需要这些额外的功能。这种发现与更替的过程。会在整个面向对象过程中持续发生。
shape
draw()
erase()
move()
getcolor()
setcolor()
circle square triangle
FlipVertical()垂直
FlipHorizontal()水平
虽然继承意味加入新功能到接口中(java和php都以extends代表继承)但并非都如此。第二种方法:便是改变既有之base class的函数行为,这种行为称之为"覆写overriding",也就是在derived class中重新定义parent class中的函数,但其他接口函数相同。
shape
draw()
erase()
move()
getcolor()
setcolor()
circle square triangle
darw() draw() draw()
erase() erase() erase()