初学面向对象编程绕不过去的一个坎:类是什么?

当初刚见到面向对象编程中“类”的时候,其实我是拒绝的。

“我在学编程,你却在给我讲哲学?”

什么“类是对现实生活中一类具有共同特征的事物的抽象”。。。我只是一个诞生即单身的魔法师,不是也不想当哲学家,听不懂这些的。。。

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其实翻译成‘客体’更合适,你可以去查一下‘客体’这个词条”

“我还是搞不太懂。。。您还是另请高明吧,我也实在不是谦虚。”

“哪里不懂呢?”

 

“你的美人鱼是从哪里来的?给我也整一个。。。”

它缓缓打出了一个?

“还有,您是哪位啊?”

“我是你的马甲啊,要不然你怎么水出这些?”

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值