理解面向对象设计3(建立面向对象模型之类的划分)
时间:2010-05-01 来源:qingfenghao
建立面向对象模型
2.1 划分依据
对象的划分以行为的同类和属性的相同为标准。
在相同属性下,对系统中的行为进行分类,具有相同(或一类)行为的可以分为一类,所谓相同(或一类)的行为,就是实现同样功能的行为。
a. 人和动物的本质区别在于人可以“制造工具”。这里的“制造工具”就是一种行为,而不是属性。眼睛、鼻子和嘴都是人和动物的属性,就属性而言,人和猩猩并没有什么不同。
此外,人和动物的另一个重大区别是:人是直立行走,而动物是四肢行走。“行走”也是一种行为。而人都具有相同的属性,不管是外观还是衣着。
b. “物以类聚,人以群分”。这里区分的一般标准也是行为,而不是属性。比如,活泼的人一般也喜欢和活泼的人的交往,大方的人一般不喜欢和小气的人交往。“活泼”、“大方”和“小气”也体现在人的行为而不是属性上,因为它们从外表和年龄是看不出来的。
c. 被视为“异类”的人,通常也是因为他们的行为举止与众不同。
自然界的生物是如此分类,C++中的类(class)也是如此。所以类(class)的概念契合了自然界分类的规律。
以这样观点,如果对人进行分类,那么分为黄种人、白种人和黑种人是不准确的。因为他们仅仅是属性(肤色)上的不同,而并无行为上的差异。他们具有相同的行为比如吃饭。
class Person |
但可以把人分为举止礼貌和不礼貌的。比如,如果有人吃饭很粗鲁,那就会被视为“异类”。
class PolitePerson : public Person |
UnPolitePerson和PolitePerson都从Person派生,因为当然他们都属于“人”,都有着同样的行为和属性,只不过在吃饭这个行为上有着具体的差别。
有一个问题是,东方人习惯用筷子吃饭,而西方人则习惯于刀叉,这样的行为也有差别,那么是否可以把人分类为东方人和西方人呢?理论上似乎不错,但它用接下来要讲的面向对象里的组合(Composition,有时也称为Integration/Aggregation)描述更准确。
由于叉子并不属于人本身的属性,而是人吃饭所使用到的一种工具。所以,叉子是“人”对象所包含的另一个对象。简单地说,一个对象包含另一(多)个的情形,就称之为组合。特别地,如果一个对象包含同类对象,称之为Composite(重合)。
class DishWare
area
}
if(area == eastern) dishware = new Chopsticks(); else
dishware = new Fork();
dishware->Action();
delete dishware;
if(area == eastern) dishware = new Chopsticks(); else
dishware = new Fork();
delete dishware;
} |
这样程序不需要从Person派生4个类:EasternPolitePerson, EasternUnpolitePerson,
WesternPolitePerson, WesternUnpolitePerson.