golang有抽象类吗
今天小编给大家分享一下golang有抽象类吗的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
golang没有抽象类。golang并不是面向对象(OOP)语言,没有类和继承的概念,也没有抽象类的概念;但golang中有结构体(struct)和接口(interface),可以通过struct和interface的组合来间接实现面向对象语言中的抽象类。
在 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
首先,我们需要将抽象方法定义在 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!
以上就是“golang有抽象类吗”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341