allbet在线:面试官:淦!0202年你还不知道面向对象?

admin 4周前 (06-15) 科技 4 0

2020年6月13日 多云转暴雨

I'm sad,tired,negative,powerless,Miss,lonely fine :)

那你回去等通知吧

面试官:我看你简历上说,你的主要编程语言是Java,偶然也用Python,那么你可以说一下这两个的相同点在什么地方吗?

山禾:它们都是高级程序设计语言,都是面向工具的语言。

面试官:那你讲讲你是怎么明白面向工具的吧。

山禾:emmm。。封装,继续,多态是面向工具的三大特征。

面试官:另有其他要弥补的吗?

山禾:没了

面试官:那你回去等通知吧

是什么

痛定思痛,挫折只会让我变得更强,奥利给!下面最先进入正文,首先我们需要知道面向工具是什么?

面向工具,顾名思义,是面向工具,也就是说独身狗是不配使用面向工具的编程语言的(固然只是开个玩笑,逃)。

工具,就是把现实天下中的实物映射抽象到虚拟天下中,把实物的属性和行为,通过代码的方式表达出来。然后通过设计工具的数据结构(属性),然后使用算法举行行为的模拟(方式),就完成了从现实到虚拟的一个映射。

实体 工具
属性 数据结构 变量
行为 算法 方式

与面向工具经常拿来对比的就是面向历程编程,那么他们之间的区别在什么地方呢?

面向历程和面向工具

面向历程编程,打个譬喻,我们买过的一样平常的玩具(变形金刚),我们必须要根据它说明书上的步骤,一步一步的去组装,才气获得最后的玩具,若是我们想要一个新的玩具,就要去阛阓买一个新的,然后根据说明书的顺序一步一步的组装。

而面向工具编程,就可以明白为积木,没有一个牢固的拼装方式,我们可以施展自己的想象力,去自由的拼装和组装,同样的模块在差别的地方可以起到差别的作用(多态),一块儿积木就是一个最小的单元,我们不用去体贴积木是怎么造的(封装)。也可以用多个工具组装起往复拼装成一个新的工具(继续)。大大的利便了我们的设计,不再拘泥于历程,极大程度上的放飞了生产力和效率

为什么

我们刚刚已经了解了面向工具是什么,下面我们来说一下,为什么要用面向工具编程

  1. 首先从明白角度上来说,它相符我们对现实天下的认知习惯,更容易去明白、实现和设计我们的需求。

  2. 其次从软件设计的角度上来说,行为的实现对于外部是完全封锁的,只需要提供对应的接口就可以获得响应的效果,降低了代码与代码之间的耦合度。相符我们高内聚,低耦合的设计理念。优雅,客观,井井有条,像积木一样,可以利便的实现插拔和维护,工具组合而成的模块化和服务化,更是大大扩展了系统的伸缩性,便于维护、扩展和复用。这也是为什么越来越多的编程语言选择向这个偏向去靠拢( TypeScript说的就是你

怎么用

刚刚我一直忍住,没有去提面向工具的三大特征:封装、继续和多态,我信赖我们有一些履历的开发人员来说,这三个词语是再熟悉不过了。下面,我通过代码的方式,来看看这三个特征在代码中的模拟应用。

封装

@Data
public&NBsp;class Uzi {

    // 选手类型
    private String type;
    // 选手最善于英雄
    private String bestHero;
    // 选手状态
    private Status status;
    
    public void play() {
        status.say();
    }
}

public class Status {
   public void say(){}
}

上面是一段异常简朴的代码,我界说了一个很简朴的类,内里的nametypebestHero对于我们来说都是一个包装在盒子里的器械。好比:

    Uzi uzi = new Uzi();
    uzi.setType("ADC");
    uzi.setBestHero("孙尚香");

我们看到的Uzi可能就是一个主玩孙尚香的职业ADC选手(狗头保命,我啥都不知道),他怎么玩的,我们不需要知道,我们只需要知道他这样的一名选手就可以了。这就是封装的魅力:

  1. 隐藏了实现的细节,提供对外的接见方式。
  2. 外部若是想要接见,必须经由这个方式。

继续

看完了封装,下面我们来看继续,我们分别用三个状态去继续Status类:

public class ShunFeng extends Status {
    
    @Override
    public void say(){
        System.out.println("顺风狂小狗");
    }
}
public class NiFeng extends Status {
    
    @Override
    public void say(){
        System.out.println("逆风简自豪");
    }
}

public class JueJing extends Status {
    
    @Override
    public void say(){
        System.out.println("绝境Uzi");
    }
}

关键字extends示意正在组织的新类派生于一个已经存在类。这个已经存在的类被称为父类(超类,基类);新创建的类被称为子类。在通过扩展父类界说子类的时刻,仅仅需要指出子类和父类的差别之处。因此在设计类的时刻,应该将通用的方式放在父类中,而将具有特殊用途的方式放在子类中。

我们只是在父类Status中界说了say方式,然后三种差别的类去继续这个类,然后实现方式,这样就体现出了面向工具在设计上的可扩展性,然则需要注重的是,继续会损坏封装,我们需要郑重使用,只管使用一些设计模式去制止继续,合理使用,才气体现出它的优势~

说完了继续,接下来就要去说多态了。

多态

在说多态之前,我们先来看一下代码:

public class Test {
    public static void mAIn(String[] args) {
        //uzi1
        Uzi uzi1 = new Uzi();
        ShunFeng shunFeng = new ShunFeng();
        uzi1.setStatus(shunFeng);
        //uzi2
        Uzi uzi2 = new Uzi();
        NiFeng niFeng = new NiFeng();
        uzi2.setStatus(niFeng);
        //uzi3
        Uzi uzi3 = new Uzi();
        JueJing jueJing = new JueJing();
        uzi3.setStatus(jueJing);
        
        //uzis
        Uzi[] uzis = {uzi1,uzi2,uzi3};
        // 多态
        for (Uzi uzi : uzis) {
            uzi.play();
        }
    }
}

运行程序的效果: (TMD,泪目,青结)

所谓的多态就是一个工具变量(好比上文中的status变量)可以指示多种现实类型的征象(好比status既可以引用Status工具,也可以引用它的子类ShunFeng工具)被称为多态。在运行时刻能够自动地选择挪用哪个方式的征象被称为动态绑定,上面打印出的语句,就说明晰这一点。

后续

原来我们天天挂在口边的面向工具,实在某种程度上来说,更像是一种哲学,一种计算机科学发展的自然规则。

若是你有学到,请给我点赞+关注,这是对一个坚持原创作者的最大支持!我是山禾,一模一样的皮囊,万里挑一的灵魂,一个不太一样的写手。

世事洞明皆学问,人情练达即文章。

,

联博开奖网

www.326681.com采用以太坊区块链高度哈希值作为统计数据,联博以太坊统计数据开源、公平、无任何作弊可能性。联博统计免费提供API接口,支持多语言接入。

皇冠体育声明:该文看法仅代表作者自己,与本平台无关。转载请注明:allbet在线:面试官:淦!0202年你还不知道面向对象?

网友评论

  • (*)

最新评论

文章归档

站点信息

  • 文章总数:539
  • 页面总数:0
  • 分类总数:8
  • 标签总数:969
  • 评论总数:182
  • 浏览总数:4464