Chinaunix首页 | 论坛 | 博客
  • 博客访问: 240404
  • 博文数量: 127
  • 博客积分: 34
  • 博客等级: 民兵
  • 技术积分: 655
  • 用 户 组: 普通用户
  • 注册时间: 2012-10-03 10:53
文章分类

全部博文(127)

文章存档

2013年(19)

2012年(108)

分类:

2012-10-21 18:06:19

建立面向对象模型

2.1 划分依据

对象的划分以行为的同类和属性的相同为标准。

在相同属性下,对系统中的行为进行分类,具有相同(或一类)行为的可以分为一类,所谓相同(或一类)的行为,就是实现同样功能的行为。

a. 人和动物的本质区别在于人可以制造工具。这里的制造工具就是一种行为,而不是属性。眼睛、鼻子和嘴都是人和动物的属性,就属性而言,人和猩猩并没有什么不同。
此外,人和动物的另一个重大区别是:人是直立行走,而动物是四肢行走。行走也是一种行为。而人都具有相同的属性,不管是外观还是衣着。

b. “物以类聚,人以群分。这里区分的一般标准也是行为,而不是属性。比如,活泼的人一般也喜欢和活泼的人的交往,大方的人一般不喜欢和小气的人交往。活泼大方小气也体现在人的行为而不是属性上,因为它们从外表和年龄是看不出来的。

c. 被视为异类的人,通常也是因为他们的行为举止与众不同。

 

自然界的生物是如此分类,C++中的类(class)也是如此。所以类(class)的概念契合了自然界分类的规律。

 

以这样观点,如果对人进行分类,那么分为黄种人、白种人和黑种人是不准确的。因为他们仅仅是属性(肤色)上的不同,而并无行为上的差异。他们具有相同的行为比如吃饭。



class Person
{
public:
    Eat();    //行为

protected:
   color;        //属性

}


但可以把人分为举止礼貌和不礼貌的。比如,如果有人吃饭很粗鲁,那就会被视为“异类”。




class PolitePerson : public Person
{
public:
Eat();
};

PolitePerson::Eat()
{
   Eat politely;
}

class UnPolitePerson : public Person
{
public:
   Eat();
}

UnPolitePerson::Eat()
{
   Eat Unpolitely;
}


UnPolitePersonPolitePerson都从Person派生,因为当然他们都属于,都有着同样的行为和属性,只不过在吃饭这个行为上有着具体的差别。

 

有一个问题是,东方人习惯用筷子吃饭,而西方人则习惯于刀叉,这样的行为也有差别,那么是否可以把人分类为东方人和西方人呢?理论上似乎不错,但它用接下来要讲的面向对象里的组合(Composition,有时也称为Integration/Aggregation)描述更准确。

由于叉子并不属于人本身的属性,而是人吃饭所使用到的一种工具。所以,叉子是对象所包含的另一个对象。简单地说,一个对象包含另一(多)个的情形,就称之为组合。特别地,如果一个对象包含同类对象,称之为Composite(重合)。

 




class DishWare
{
Public:
      Action();
}
class Chopsticks: public DishWare
{
Public:
      Action();
}

Chopsticks::Action()
{
    Nip the food.
}

class Fork: public DishWare
{
Public:
      Action();
}

Fork::Action()
{
    Fork the food.
}

class Person
{
public:
    Person(color, area)
     {
          this.color = color;
          this->
area = area;
     }

   Eat();        //行为

protected:
   color;        //属性

   area

}

PolitePerson::Eat()
{

    if(area == eastern)

       dishware = new Chopsticks();

   else

      dishware = new Fork();

      dishware->Action();
    Politely to mouth.

     delete dishware;
}
UnPolitePerson::Eat()
{

    if(area == eastern)

       dishware = new Chopsticks();

   else

      dishware = new Fork();


    dishware->Action();
    UnPolitely to mouth.

     delete dishware;

}


这样程序不需要从Person派生4个类:EasternPolitePerson, EasternUnpolitePerson,
WesternPolitePerson, WesternUnpolitePerson.




《返璞归真--UNIX技术内幕》在全国各大书店及网城均有销售:
                         
                       


阅读(434) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~