当前位置: 首页 > 科技观察

为什么Go不支持类和继承?

时间:2023-03-12 04:59:07 科技观察

本文转载自微信公众号《我的脑子是炸鱼》,作者陈建宇。转载本文请联系脑筋急转弯公众号。大家好,我是炸鱼。早期学习围棋的时候,一旦过了语法阶段。我很快就会进入一个新的纠缠点。Go不支持面向对象吗?这种编程语言中没有类(class)或继承(extends)。今天,剑鱼就带你了解这其中的思考。Go真的不支持吗?什么是类和继承类?对象的蓝图,描述创建的对象的公共属性和方法(来自@wikipedia)。示例如下:classSimpleClass{//declareattributepublic$var='brainfriedfish';//declaremethodpublicfunctiondisplayVar(){echo$this->var;}}每个类的定义以关键字class开头,后面是类名,后面是一对花括号,里面包含了类的属性和方法的定义。什么是继承?继承是面向对象软件技术中的一个概念。如果一个类B“继承”自另一个类A,则这个B被称为“A的子类”,而A被称为“B的父类”。"它也可以称为"A是B的超类"(来自@wikipedia)。示例如下://parentclassFoo{publicfunctionprintItem($string){echo'friedfish1:'.$string.PHP_EOL;}publicfunctionprintPHP(){echo'PHPisgreat.'.PHP_EOL;}}//子类classBarextendsFoo{publicfunctionprintItem($string){echo'Friedfish2:'.$string.PHP_EOL;}}继承有如下两个特点:子类拥有父类的各种属性和方法,不需要再写同样的代码,子类继承父类时,可以重新定义一些属性,重写一些方法,从父类中获取不同的功能。组合在Go中是“特殊的”,因为没有传统的类,也没有继承。取而代之的是事物的结构和组合方式。这也是业界关于Go到底是不是OOP的最大争议。结构我们可以在Go中以结构的形式组织代码,以实现类类的方法。示例如下:packagemainimport"fmt"typepersonstruct{namestringageint}func(p*person)hello(){}funcnewPerson(namestring)*person{p:=person{name:name}p.age=42return&p}funcmain(){英尺。Println(person{"FriedFish1",22})fmt.Println(person{name:"FriedFish2",age:33})...}在上面的代码中,我们可以在结构体中定义属性,并且对于结构,这些类型可以定义只属于它们的方法。在声明实例上,可以用newXXX的初始化方法生成,这是Go中惯用的方式。组合类的声明被结构体代替后,也可以与“组合”结合使用,达到类似继承的效果。一个例子如下:name}return&p}funcmain(){p:=newPerson("大脑是炸鱼")p.hello1()}上面代码中,我们分别定义了man和person两个结构体,将man嵌入到person中形成组合。在main方法中可以看到person实例可以使用和调用man实例的一些公共属性和方法。从简单的使用上来说,会有些接近继承。IsGoanobject-orientedlanguage“IstheGolanguageanobject-orientedlanguage?”,这是一个日经话题。官方FAQ给出的答案是:yesandno。原因是:Go有类型和方法,允许面向对象的编程风格,但没有类型层次结构。Go中的“接口”概念提供了一种我们认为易于使用且在某些方面更通用的不同方法。还有一些方法可以将类型嵌入到其他类型中,以提供类似但不等同于子类化的东西。Go中的方法比C++或Java中的方法更通用:它们可以为任何类型的数据定义,甚至是内置类型,如普通的“未装箱”整数。它们不限于结构(类)。Go由于缺乏类型层次结构,Go中的“对象”比C++或Java等语言更轻量级。为什么不支持类和继承?有人认为类和继承是面向对象的必要特征,它们必须存在才能成为面向对象的语言,但事实并非如此。面向对象(OOP)具有不同的含义和解释。许多概念也可以通过结构、组合和接口来表达。据说不支持传统的OOP。其实,事实是Go选择了另一条路,即“组合胜于继承”。我们提到的类和继承不是定义OOP的指南,而只是帮助它的方法之一。不要本末倒置,让工具定义OOP的哲学。小结在今天的文章中,我们介绍了大家常说的类和继承的行业定义和用例。同时解答了围棋读者的疑惑。从本质上讲,Go是OOP,而不是OOP。类和继承只是实现OOP的一种方式,但没有它们就不是OOP。不支持的理由也很明确。在设计上,Go选择了组合而非继承的编程设计模式,这不是传统的面向类型的范式。