• 在Golang中实现多态


    1、说明

    和流行的面向对象语言不同,go 中没有面向对象的说法,也没有对应的封装、继承和多态,也许 go 的设计就不是和OOP对齐,想使用OOP,那就去用 Java 或者 C++ 吧。

    但是,没有不表示 go 不能,我们仍然可以拐着弯地去使用

    比如封装,可以用结构体模拟;继承可以使用接口和嵌套结构体,多态有些麻烦,前两者结合也可以实现

    2、多态

    程序设计中有一种风格鸭式辩型,javascript 里面常用,大概意思就是,走路像鸭子,叫起来像鸭子,那么它就是一只鸭子

    把它放到 go 中,尽管没有多态,但是能实现多态相同的用法,那它就是多态

    3、代码示例

    我们用手机举例子,现在有多款手机,都能打电话(call()),但是打电话的内容不同,我们要能实现动态地切换不同手机打电话

    放在 C++/java 中,这个功能很容易实现,只需要创建一个基类 Phone,然后不同手机的子类继承 Phone,实现 call() 方法即可,go 中,使用以下方式实现

    示例:

    type PhoneData struct {
    	name string
    }
    
    type Phone interface {
    	call()
    }
    

    Phone 定义接口,后面需要实现这个接口,PhoneData 则表示各个手机都有的属性(这里是name)

    type IPhone struct {
    	PhoneData
    }
    
    func (phone *IPhone) call() {
    	fmt.Printf("%s call\n", phone.name)
    }
    

    定义 IPhone,实现 call() 方法

    type HWPhone struct {
    	PhoneData
    }
    
    func (phone *HWPhone) call() {
    	fmt.Printf("%s call", phone.name)
    }
    

    定义 HWPhone,实现 call() 方法

    func getPhone(name string) Phone {
    	switch name {
    	case "iphone":
    		phone := new(IPhone)
    		phone.name = "iphone"
    		return phone
    	case "hwphone":
    		phone := new(HWPhone)
    		phone.name = "hwphone"
    		return phone
    	default:
    		fmt.Println("no phone")
    	}
    	return nil
    }
    

    对象工厂,根据参数,获取不同的手机

    func main() {
    	var phone Phone
    	phone = getPhone("hwphone")//输出hwphone call
    	phone.call()
    }
    

    调用处,这里的的 phone 变量执行的 call() 方法,可以能是 IPhone,也可能是 HWPhone

    4、总结

    每种语言都有它的优势和劣势,go 可能设计之初就不是基于 OOP,强行按照 OOP 的思路写 go 到底是正途还是歪门邪道,我也不知道。写惯了 OOP 的人,即使换一种语言总喜欢用 OOP 的思路去套用,果然,思维的转换才是最难的

    还是需要学习啊!!!

  • 相关阅读:
    前端编译原理 简述-jison
    GraphQL入门
    前端理解控制反转ioc
    window.onload和JQuery中$(function(){})的区别即其实现原理
    移动web之一像素问题
    display:table和display:table-cell的妙用
    sticky footer布局
    Elements in iteration expect to have 'v-bind:key' directives错误的解决办法
    vue模拟后台数据,请求本地数据的配置(旧版本dev-server.js,新版本webpack.dev.conf.js)
    使用vue-cli脚手架搭建项目,保存编译时出现的代码检查错误(ESLint)
  • 原文地址:https://www.cnblogs.com/sherlock-lin/p/15614747.html
Copyright © 2020-2023  润新知