4类和对象
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
类图
如何对类命名?
命名:简单名,路径:包名::子包::类名 语义:被建模系统的词汇表中提取的名词或名词短语。 语法:字符、数字、其它符号组成的字符串,首字符大写。 一个类就是一种新的类型。
属性是什么?
属性:对类中每个对象所包含的某一种数据或状态的抽象。 一个对象在特定时刻在每个属性上都有确定值。 语义:表示类的特征的名词或名词短语。 语法:可仅表示属性名,也可详细描述:类型、缺省值等。
面向对象建模技术
基本结构建模-类和对象
面向对象建模技术-类和类图
建模的一般步骤 识别参与者
直接于系统交互的人或系统
识别用例,画用例图,写出用例文档
一组动作序列,对参与者产生有价值的结果
用活动图描述特定的用例
描述一个过程或者操作的工作步骤,捕获动作及其结果
根据用例和文档抽象出类
捕获系统的静态特征
对象和类
超类的引用指向子类的对象
例如:Java使用引用变量来指代对象,我们用 “Shape s1;”来说明一个引用变量,该变 量的说明类型为Shape,它不仅可指代Shape 类的对象,而且可指代Shape类的所有子类的 对象。所以,“s1=new Polygon();”,使 s1变量指代一个Polygon对象。在运行过程中, s1变量拥有一个不变的说明类型(也称为静态 类型),但可指代一组实际类型(也称为动态 类型)的对象。
多态性
void Draw(shape *aShape) //多态函 数 { aShape->Draw(); }; main() {
circle aCircle; cube aCube sphere aSphere; Draw(&aCircle); circle Draw(&aCube); cube Draw(&aSphere); sphere
一是使用来自问题域的概念 二是类的名字用该类实际代表的涵义命名点
系统中有哪些角色 有没有一定要存储或分析的信息 有没有外部系统 有没有模版 类库 组件等 系统中有被控制的设备吗 有无需要表示的组织机构
课堂练习
找出图书管理系统中的类,并找出类的属性 及操作.
继承性
继承是类与类之间的一种关系,它 使开发人员在已有类的基础上定义 和实现新类。继承是利用可复用软 件构造系统的有效语言机制。 继承能有效地支持类的复用,当需 要在系统中增加新特征时,所需的 新代码最少,并且当继承和多态性 结合使用时,为修改系统所需变动 的源代码最少。
继承性反映自然的分类结构 (IS-A关系)
多态特性
多态性的一般性含义是,某一论域中的一个 元素可以有多种具体解释。编程语言中的重 载(overload)和类属(generic)都是支持多态性 的机制,而继承性是特有的另一种支持多态 性的机制。 多态性是进行抽象设计和抽象编程的重要手 段。一个软件系统中,抽象越丰富,适应变 化的能力就越强,也有利于合理使用。
类的封装特性与信息隐藏
信息/实现隐藏有两个主要优点:
设计决策局部化。在对象内私有的设计决策 对系统其它部分影响很小,甚至没有影响, 因此,对局部决策的修改对整个系统的影响 最小,这样限制了“修改蔓延”的影响。 减少信息内容。因对象对外部隐藏实现细节, 这使外部用户不会受到对象内部信息特定格 式的困扰,这样对象外部用户,即其它程序 员,就不用干涉对象内部的事情,也防止向 对象内部引入不稳定的连接。
class Head { public:
void Look(void) { m_eye.Look(); } void Smell(void) { m_nose.Smell(); } void Eat(void) { m_mouth.Eat(); } void Listen(void) { m_ear.Listen(); }
单继承 多继承 抽象类
类的继承特性
规则1:如果类A和类B毫不相干,不可以为了使B的功能 更多而让B继承A的功能和属性。
class A { public: void Func1(void); void Func2(void); }; class B : public A { public: void Func3(void); void Func4(void); }; main() { B b; b.Func1(); //B从A继承了函数Func1 b.Func2(); //B从A继承了函数Func2 b.Func3(); b.Func4(); }
规则3:若在逻辑 上B是A的“一种”, B A 并且A的所有功能和 属性对B而言都有意 义,则允许B继承A 的功能和属性。
类的组合特性
class Eye { public:
void Look(void);
若在逻辑上A是B的“一部分”(a part of),则不 允许B从A派生,而是要A和其他东西组合出B。
(Objects form the substance of the world)
百度文库 什么是对象?
对象是现实世界中客观存在的事物 具有明确定义的边界和唯一标识的一个实体 状态和行为的一个封装体 某个类的一个实例
什么是类?
一个类是具有相同特征、约束和语义规范的 一组对象的抽象描述。 类是抽象的,而对象是具体的实例 类是静态的,而对象是动态的
属性名[:类型[ = 缺省值]] 首字符小写,后面其它词的首字符大写。
类图
操作是什么?
操作:该类对象可被请求提供的一项服务。 调用操作可改变对象的数据或状态,或可访问对象内部 的数据或状态。 语义:表示类的特征的动词或动词短语。 语法:操作名及形参,首字符小写,后面其它词的首字 符大写
类图-定义类
void Listen(void);
};
}; // 正确的设计,冗长的程序
类的组合特性
// 错误的设计 class Head : public Eye, public Nose, public Mouth, public Ear { … };
继承性允许子类与其超类具有相同的 操作
这有两种目的, 其一是“实现”。超类仅说明抽象的操作而 未提供实现方法,子类应按相同的基调来提 供具体的“实现”; 其二是“改写”。超类虽提供了具体实现, 但子类需要根据自己的特殊情况给出具体实 现,以“改写”继承而来的行为。这是一种 多态性的情形。
Abstract B Class ase
Shape
Abstract Class
Shape2D
Shape3D
//绘制一个 //绘制一个 //绘制一个
Circle
Ellipse
Cube
Sphere
}
多态性--超类的引用指向子类的对象
由继承性可知,每个子类对象都是其超类的 一个对象。这意味着,子类的每个对象都属 于其直接或间接的超类。例如,一个多边形 对象不仅属于Polygon类,而且属于Shape类。 换言之,当需要一个超类对象的时候,而提 供了一个子类对象,总应该是可行的。 子类对象在任何情况下都能替代超类对象, 反之不然。
面向对象的基本特征
封装性 继承性 多态性
类的封装特性与信息隐藏
class WhoAmI { public: void getMyName(void); //名字是可以公开的 protected: oid getMyAsset(void); //财产是受保护的,只有我和继 承者可以使用 private: void getMyGuilty(void); //罪过是要保密的,只有我自 己才能偷看 … };
什么是对象? 什么是对象? 路德维希·维特根斯坦 逻辑哲学论》 维特根斯坦《 路德维希 维特根斯坦《逻辑哲学论》
(Wittgenstein Tractatus Logico-Philosophicus)
世界可以分解为事实( The world divides into facts) 事实是由原子事实组成(atomic facts) 一个原子事实是多个对象的组合(objects) 对象是简单的(The Object is simple) 对象形成了世界的基础
//Boy是Man的派生类
类的继承特性
继承的概念在程序世界与现实世界并不完全相同
class Bird { public: virtual void Fly(void);//鸟能够飞行 …… }; class Ostrich : public Bird //鸵鸟是鸟的一种 { public: virtual void Fly(void); //如何让鸟飞起来? …… };
类的继承特性
规则2:若在逻辑上B是A的“一种”(A kind of),则允许 B继承A的功能和属性。
class Human { … }; class Man : public Human { … }; class Boy : public Man { … }; //Human是基类
//Man 是Human的派生类
封装与状态保持
在对象封装基础上,对象具有保持自己状态的能力。 当传统的过程模块(如函数、子程序、过程等)返回 到调用方,只是把计算结果返回,而不能保持自己 的状态。当同一个过程模块再次调用时与首次调用 一样,模块对以前的状态没有记忆。 对象在自身内部封装了状态信息,并保持直到对象 消亡。在对象生命期中可被多次调用操作,每次状 态改变都能保持记忆。而且,对象如何保持其状态 是隐藏在内部的细节。外部无需知道如何处理。 面向对象封装、信息/实现隐藏及状态保持是面向对 象的核心思想。
}; class Nose { public:
void Smell(void);
}; class Mouth { public:
void Eat(void);
private:
Eye m_eye; Nose m_nose; Mouth m_mouth; Ear m_ear;
}; class Ear { public: