• 技术文章 >后端开发 >Golang

    golang是否有抽象类

    青灯夜游青灯夜游2023-01-06 19:04:35原创90

    golang没有抽象类。golang并不是面向对象(OOP)语言,没有类和继承的概念,也没有抽象类的概念;但golang中有结构体(struct)和接口(interface),可以通过struct和interface的组合来间接实现面向对象语言中的抽象类。

    本教程操作环境:windows7系统、GO 1.18版本、Dell G3电脑。

    在 Java 这种面向对象的语言中,抽象类和接口是我们经常会运用到的 2 种对抽象概念进行定义的机制。在 golang 中,没有类和继承的概念。golang 中有结构体(struct),和面向对象语言中的类相似。golang 中也有接口(interface),接口可以定义一组不含有具体实现的方法,其提供了一种方式来说明对象的行为。

    然而,在某些情况下,我们需要使用抽象类继承,来帮助我们写出更优雅的代码。可是在 golang 中又没有抽象类的概念,本文将介绍一种通过 struct 和 interface 来在 golang 中实现抽象类的方法。

    Golang中怎么实现抽象类

    下面我们会用 Java 语言作为示例,来看看如何在面向对象语言中实现抽象类。接着换 golang 语言,通过 struct 和 interface 来实现抽象类,完成相同的功能。

    面向对象语言中抽象类的实现

    假设我们需要实现下面这样的几个类(使用 Java 为例):

    public abstract class Game
    {
        public void play()
        {
            System.out.println(this.name() + " is awesome!");
        }
        public abstract String name();
    }
    public class Dota extends Game
    {
        public String name()
        {
            return "Dota";
        }
    }
    public class LOL extends Game
    {
        public String name()
        {
            return "LOL";
        }
    }

    我们定义了 Game 抽象类,在此类中定义了 public abstract String name(); 一个抽象方法和 public void play() 这样一个公开方法。然后我们定义了 Dota 和 LOL 2个类去继承 Game,并各自实现了 public String name()。

    接下来让我们看看如何在 golang 中实现抽象类。

    golang 中实现抽象类的方式

    首先,我们需要将抽象方法定义在 interface 中。

    type IGame interface {
    	Name() string
    }

    然后,我们需要使用 struct 实现公共方法。

    type Game struct {}
    func (g *Game) play(game IGame) {
    	fmt.Printf(fmt.Sprintf("%s is awesome!", game.Name()))
    }

    这里是重点,我们将 game IGame 传了进来。这样我们便可以调用”子类”的方法来获取名字。从而间接地实现了在公共方法中调用不同”子类”的实现的抽象方法。

    接着,我们再定义”Dota”和”LOL”这 2 个 struct 即可。

    type Dota struct {
        Game
    }
    func (d *Dota) Name() string {
    	return "Dota"
    }
    type LOL struct {
        Game
    }
    func (l *LOL) Name() string {
    	return "LOL"
    }

    现在,在初始化”Dota”和”LOL”结构体后,便可以调用 func (g *Game) play(game IGame) 方法了。

    dota := &Dota{}
    dota.play(dota)
    
    lol := &LOL{}
    lol.play(lol)
    
    // 输出:
    //Dota is awesome!
    //LOL is awesome!

    总结

    本文通过 struct 和 interface 的组合,提供了一种思路,间接实现了面向对象语言中的抽象类继承的模式。

    【相关推荐:Go视频教程编程教学

    以上就是golang是否有抽象类的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:抽象类 go语言 Golang
    上一篇:go语言只能开发服务端吗 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • golang怎么修改切片的值• go语言是机器语言吗• golang是免费的吗• go语言可以写数据库么• go和c语言是一个作者吗
    1/1

    PHP中文网