资讯专栏INFORMATION COLUMN

对面向对象的理解

ethernet / 2620人阅读

摘要:回来正题,继续探究面向对象。其实面向对象是有一系列的继承关系,实现关系,依赖关系组成。希望这篇文章可以帮助到一些对这方面还有困惑,不解的小白。我也是一个一年多的小白

好,今天来给大家总结一下我觉得的面向对象。

首先,我们带着问题去想。

问题就是:什么是面向对象?

过去一些学校老师每当讲到面向对象的章节,都会猫不犹豫的定义一些class(类)。那么,这就是面向对象了么?过去我也是这么认为的,但现在看来,其不然。

那么到底什么才是面向对象呢?

相信到这里大家都有一些疑惑。那平时咱们写那么多的类,难道都不是面向对象?我很遗憾的告诉你,并不全是。包括我一年前刚入职写了很多代码,也维护过很多"前辈"的项目,当时又傻又天真的以为:"哇,这代码真特么牛逼,一个类就几百几千行"。

现在回头一想,哎呀我去,我都没眼看了,那些代码,跑着跑着,是会出bug的,他们的质量不过关就,那上去跑了,跑条毛啊,最终还不是返回来给我们改bug。

到目前为止,我已经慢慢开始转变了这些想法。其实那都不是叫面向对象,因为他们把不同类本身该有的事情都综合起来一个类里面,所以它本身只是个类,并不具备面向对象的基本特质。

回来正题,继续探究面向对象。想想我们人类。举个简单的例子:

/** 
 * 抽象人类,人们说的人类,反正就是随你想的
 */
Interface Human
{
    public function setLastName($last_name);

    public function getLastName();

    public function setFirstName($first_name);

    public function getFirstName();
}

/** 
 * 我老爸
 */
class Father implement Human
{
    /** 
     * 姓,在国内,姓是不能随便改的,当然也是可以改。所以这里修饰成保护
     */
    protected $last_name;

    public $first_name;

    public function setLastName($last_name)
    {
        $this->last_name = $last_name;

        return $this;
    }

    public function getLastName()
    {
        return $this->last_name;
    }

    public function setFirstName($first_name)
    {
        $this->first_name = $first_name;

        return $this;
    }

    public function getFirstName()
    {
        return $this->first_name;
    }
}

/** 
 * 儿子 - 我
 */
class Son extends Father
{

}

$father = new Father();
$father->setLastName("黄");

$son = new Son();
$son->setFirstName("总");
// 打印我的名字
echo $son->getLastName() , $son->getFirstName();

既然我继承我老爸,当然是跟我老爸姓的啦。要改姓也可以,得问问老爸是否同意先。

不过一般我们的做法是

直接定义一个"Son"类,然后里面各种方法,甚至一些人类不可以做到的方法,比如会飞(不借助工具),反正就是一个类里头夹杂各种不可思议的方法,真的是万万没想到。那么如果是这样,那其实我就不认为这是面向对象了,而是简单的定义类而已。

其实面向对象是有一系列的继承关系,实现关系,依赖关系组成。写代码,做开发,其实和生活是息息相关的,多留意自己的生活,多拿生活例子在开发工作中举例,其实,原理就一目了然了。

继续回来上面的话题,继续面向对象。

比如说,我老爸会使用工具,但是我也会,而且过程,结果大不相同,而且使用的工具也不一样,而且这个工具是需要买,或者找别人借的,不是自己家的。结合上面的小例子稍微修改一下。

/** 
 * 抽象人类,人们说的人类,反正就是随你想的
 */
Interface Human
{
    ......   // 代码省略
    public function useTools(ToolInterface $toolInterface = null);
}

/** 
 * 我老爸
 */
class Father implement Human
{
    /** 
     * 姓,在国内,姓是不能随便改的,当然也是可以改。所以这里修饰成保护
     */
    ...... // 代码省略
    public function useTools(ToolInterface $toolInterface = null)
    {
        $result = $toolInterface->useTool();
        ......//代码省略,自由发挥
        // 用工具得到结果,经过老爸一系列加工,变成了不一样的东东
        return $result
    }
}

/** 
 * 儿子 - 我
 */
class Son extends Father
{
    ...... // 代码省略
    public function useTools(ToolInterface $toolInterface = null)
    {
        // 使用工具,我想调整一下这个工具再使用
        ......// 调整中
        $result = $toolInterface->useTool();
        ......//代码省略,自由发挥,加工结果
        return $result
    }
}

Interface ToolInterface 
{
    public function useTool();
}

class Nokia implements ToolInterface
{
    // 代码自己想想
    public function useTool();
}

class IPhone20Plus implements ToolInterface
{
    // 代码自己想想
    public function useTool();
}

$father = new Father();
$father->setLastName("黄");

$son = new Son();
$son->setFirstName("总");
// 打印我的名字
echo $son->getLastName() , $son->getFirstName();
// 使用工具, 我不管他们怎么使用,反正我就是给了他了。而且,只要是个工具(实现ToolInterface)就行了
$father->useTool(new Nokia());
$son->useTook(new IPhone20Plus());

那么其实到这里,你可以很清晰的看到,其实这,才算是"我理解"的面向对象。每个类都有自己多带带,独有的方法,不同的操作。

而且在后面工具的哪里,我并没有强制的在内部是使用工具,而是在外部通过注入的方式去实现想要的。

再想想现实中,我们用的iPhone,安卓,到底是哪里来的呢?就是买来的嘛,总没有说自己出一款,就算是自己出的,零件也是需要依赖各个地方的吧。所以其实我们整个生活圈就是一个很大的生态系统,你在编程世界里面有的,基本上在生活当中都能找到影子。

而且这样有一个很好的好处,就是你会不知不觉的,降低了类与类之间的耦合性了,我们面向对象,要的不就是这个效果吗?再结合学过的知识,面向对象的特性,好好思考这些问题,不断考量,改善自己的这些想法。

希望这篇文章可以帮助到一些对这方面还有困惑,不解的小白。有什么地方说的不足的,还请各位大大指点,感谢各位。

By Jan(我也是一个一年多的小白)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20907.html

相关文章

  • 面向 JavaScript

    摘要:是完全的面向对象语言,它们通过类的形式组织函数和变量,使之不能脱离对象存在。而在基于原型的面向对象方式中,对象则是依靠构造器利用原型构造出来的。 JavaScript 函数式脚本语言特性以及其看似随意的编写风格,导致长期以来人们对这一门语言的误解,即认为 JavaScript 不是一门面向对象的语言,或者只是部分具备一些面向对象的特征。本文将回归面向对象本意,从对语言感悟的角度阐述为什...

    novo 评论0 收藏0
  • 7. 初步理解面向象 【连载 7】

    摘要:是一种典型的面向对象编程语言。这篇文章主要是来初步理解一下面向对象的思维为下面的内容先给一个基础。针对面向对象编程的更多内容,会在后面的文章里面详细解释。他们都称之为对象。之后,我们再用编程语言,把这种映射编写出来,就是的面向对象编程啦。 showImg(https://segmentfault.com/img/remote/1460000012983458?w=900&h=500);...

    keelii 评论0 收藏0
  • 谈谈我面向象以及类与理解

    showImg(https://segmentfault.com/img/remote/1460000007103938?w=391&h=247); 文章最初发表于我的个人博客非典型性程序猿 对于刚接触JAVA或者其他面向对象编程语言的朋友们来说,可能一开始都很难理解面向对象的概念以及类和对象的关系。笔者曾经带过一个短期培训班教授java入门基础,在最后结束课程的时候,还有很多同学不太理解面向对象...

    walterrwu 评论0 收藏0
  • 谈谈我所理解面向

    摘要:众多面向对象的编程思想虽不尽一致,但是无论哪种面向对象编程语言都具有以下的共通功能。原型编程以类为中心的传统面向对象编程,是以类为基础生成新对象。而原型模式的面向对象编程语言没有类这样一个概念。 什么是面向对象?这个问题往往会问到刚毕业的新手or实习生上,也是往往作为一个技术面试的开头题。在这里我们不去谈如何答(fu)好(yan)问(guo)题(qu),仅谈谈我所理解的面向对象。 从历...

    avwu 评论0 收藏0
  • javascript 面向象版块之理解

    摘要:用代码可以这样描述安全到达国外面向过程既然说了面向对象,那么与之对应的就是面向过程。小结在这篇文章中,介绍了什么是面向对象和面向过程,以及中对象的含义。 这是 javascript 面向对象版块的第一篇文章,主要讲解对面向对象思想的一个理解。先说说什么是对象,其实这个还真的不好说。我们可以把自己当成一个对象,或者过年的时候相亲,找对象,那么你未来的老婆也是一个对象。我们就要一些属性,比...

    lovXin 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<