当初刚见到面向对象编程中“类”的时候,其实我是拒绝的。
“我在学编程,你却在给我讲哲学?”
什么“类是对现实生活中一类具有共同特征的事物的抽象”。。。我只是一个诞生即单身的魔法师,不是也不想当哲学家,听不懂这些的。。。
1.“简单易懂”的现代“魔法”
“emmmm......魔法师是吧,你能实现我的一个愿望吗”
我缓缓打出一个?
“我需要一个脸盆,能装下我家美人鱼的那种。。。”
“你家的美人鱼,她大吗?”
“他不是大不大的问题,他就是那种,很少见的那种。。。我们还是先说脸盆吧。你下一句要说的是:‘是什么样的脸盆?’,对吧?”
“是的,又好像不是。”
“这是你造脸盆所用魔法可能需要的一些信息:”
//长度单位:m
//质量单位:Kg
脸盆 容器的一种
{
口径=10;
底半径=7;
颜色="透明";
高=4;
质量=4000;
材质="玻璃";
能力: 装水(需要:水);
能力: 养鱼(需要:鱼);
}
“你管这叫脸盆?怕不是要拿来酸洗鳄鱼脸。。。”
“你都能听到我说话了,还有什么是值得惊诧的?趁你还有理智值,赶快动起来!”
“怎么动?”
“魔法师连new也不会吗?到时候女朋友都搞不出来!我给你的这些信息,便是脸盆的特征,或者叫‘属性’,有了这些信息,你的脑子就可以通过调用你的记忆,想象出这个脸盆的模型来。”
2.幻想世界的规矩
“心理学家发现,人类的大脑,会将一些具有相同特征的不同的物体归纳为"某一 类 "物体。”
“这就是所谓的抽象——提取出超市中”脸盆“货架上的所有玩意(即具有相同特征的不同物体)的相同特征,构成(归纳为,或者叫‘抽象为’)一个标准的,平均的)模型(或者说,概念),将所有与这一‘标准’模型足够相似的玩意,以及以后可能遇到的类似的玩意,都取一个名字:脸盆。”
“例如,一个小朋友可能会试图把TA遇到的所有的‘带毛皮的四足动物’都归类为‘狗’,直到TA在电视机上看见一只‘不太一样的,很特别的那种带毛皮的四足动物’被叫做熊”
”不同的概念之间的联系是有层次与结构的,比如下面这张来自心理学教材的图:”
(有兴趣的可以百科上查一下“图式”这一词条)
例如”动物“,“鱼”和“鸟”这些概念写成咒语就是:
//一个功能后面接一个"=0",例如"呼吸()=0;"
//表示不同的动物之间(例如 人 与 鱼 之间)呼吸的具体机理(它们能呼吸的原因)不一样
//需要具体情况具体分析
动物 生物的一种
{
皮毛;
功能:动()
{
肌肉细胞收缩();
};
功能:吃(需要:能吃的东西)=0;
功能:呼吸(需要:氧气)=0;
}
鸟 动物的一种
{
羽毛;
翅膀;
功能:飞()
{
翅膀进行扇动();
};
功能:吃(需要:能吃的东西)
{
啄食(能吃的);
};
功能:呼吸(需要:氧气)//这个功能需要一个新的核心进行并行处理
{
while(1)
{
肺吸气(氧气);
肺呼气();
}
};
}
鱼 动物的一种
{
鱼鳍;
功能:游泳()
{
鱼鳍运动();
};
功能:吃(需要:能吃的)
{
咬(能吃的);
};
功能:呼吸(需要:氧气)//这个功能需要一个新的核心进行并行处理
{
while(1)
{
鳃吸气(氧气);
鳃呼气();
}
};
}
画一下妆,变成C++代码:
// ↓ 这个标志表示类的继承
// ↓ 将动物,植物,原核生物(在这里以“动物”为例)等都归类为“生物”旗下
// ↓ 表明植物,动物,原核生物都是生物的一种,
// ↓ 拥有了(或者说是“继承了”)生物的一切特征
// ↓ “继承”在程序中可以用来减少代码复杂度
// ↓ 就像可以对代数式提取公因式以减少代数式长度一样
// ↓
class Animal : Creature
{
public:
Fur cloths;
void Move()
{
Muscle.Contract();
};
virtual void Eat(Eatable foods)=0;
virtual void Respire(Oxygen o2)=0;
// ↑
// 这个类是抽象类,因为这两个函数都是纯虚函数(看到箭头指的那两个"=0"了吗?)
// 即所有的动物都有其更具体的名称(比如鸡🐔,虫🐛,蛇🐍,马🐎……)
//
//抽象类一个重要的特征是不能实例化
//因为你看不到一个种名(“界门纲目科属种”的种)就叫“动物”,而没有一个更具体的名称的生物
//
//再举一个例子:
//
// “我要一个水果。”
// “不,这是苹果,我不要苹果,我要水果”
// “不,这是香蕉,我不要香蕉,我要水果”
// “不,这是柚子,我不要柚子,我要水果”
// “不,这是西瓜,我不要西瓜,我要水果”
// “不,这是……”
//
//很明显,这位顾客是不会找到自己想要的所谓“水果”的,因为“水果”是一个抽象类
//
//抽象类的某些功能(比如“动物”的“吃(需要:食物)”)
//在不同的具体物种之间的实现是不同的(翻译成人话,就是不同动物的进食方式不同)
//需要像在刚才“咒语”的注释种提到的那样,需要具体情况具体分析
//在程序中也有可能需要这种“具体情况具体分析”,这在程序中叫做“多态”
}
class Bird : Animal
{
public:
Feather feather;
Wing wings[2];
void Fly()
{
wings[0].Flutter();
wings[1].Flutter();
};
virtual void Eat(Eatable food)
{
Peck(food);
};
virtual void Respire(Oxygen o2)/*这个功能需要一个新的核心进行并行处理*/
{
while(1)
{
lung.Inhale(o2);
lung.Exhale();
}
};
}
class Fish:Animal
{
public:
Fin fins;
void Swim()
{
fins.Flutter();
};
virtual void Eat(Eatable food)
{
Bite(food);
};
virtual void Respire(Oxygen o2)/*这个功能需要一个新的核心进行并行处理*/
{
while(1)
{
gill.Inhale(o2);
gill.Exhale();
}
};
}
3.Oops......
“但是这个由逻辑门通断构成的脸盆需要通电,一断电就消失了”
“面向对象编程(Object Oriented Programming,OOP)中的Object其实翻译成‘客体’更合适,你可以去查一下‘客体’这个词条”
“我还是搞不太懂。。。您还是另请高明吧,我也实在不是谦虚。”
“哪里不懂呢?”
“你的美人鱼是从哪里来的?给我也整一个。。。”
它缓缓打出了一个?
“还有,您是哪位啊?”
“我是你的马甲啊,要不然你怎么水出这些?”