首页 > 其他分享 >golang 入门(七) 接口-多态

golang 入门(七) 接口-多态

时间:2023-02-17 14:05:04浏览次数:31  
标签:入门 self 多态 golang PowerOff computer 父类 type laptop

所谓多态就是子类在继承了父类后,自己重新写了一个方法覆盖父类的同名方法。继续引用上文的案例,父类computer中有PowerOff方法,但是子类laptop把盖子合上也可以认为是一种PowerOff。所以laptop类重新实现的PowerOff就是类的多态的实现。在Python中的实现如下:

class Computer:
def __init__(self, computer_type):
# 描述基础属性 电脑类型
self.computer_type = computer_type

def PowerOn(self):
print("{} 开机".format(self.computer_type))

def PowerOff(self):
print("{} 关机".format(self.computer_type))


class Laptop(Computer):
# 声明实例化这个类时需要带入的参数
def __init__(self, computer_size, computer_type):
# 填充父类所需的属性
Computer.__init__(self, computer_type)
# 声明子类特有的属性
self.computer_size = computer_size

def move(self):
print("{} 寸的电脑被拿走了".format(self.computer_size))

# 重新实现一个PowerOff方法,覆盖父类的同名方法
def PowerOff(self):
print("{} 被合上了盖子".format(self.computer_type))

def ComputerPowerOff(self):
# 通过super还可以调用父类的方法
super().PowerOff()


# 实例化子类并根据声明将父类和子类所需的参数一并传入
lap = Laptop(14, "laptop")

# 在子类中可以调用父类的PowerOff方法
lap.ComputerPowerOff()
# 在子类中调用自己的PowerOff方法
lap.PowerOff()
% python main.py
laptop 关机
laptop 被合上了盖子

在Go的实现代码如下:

package main

import "fmt"

type Computer struct {
ComputerType string
}

type ComputerClass interface {
PowerOn() string
PowerOff() string
}

func (c Computer) PowerOn() string {
ret := fmt.Sprintf("%s 开机", c.ComputerType)
return ret
}

func (c Computer) PowerOff() string {
ret := fmt.Sprintf("%s 关机", c.ComputerType)
return ret
}

// 下面是子类相关的内容

type Laptop struct {
ComputerSize int
// 在结构体中嵌套另一个结构体,并且只声明类型而不命名,称为匿名调用
// Go中通过这种匿名调用,表示Laptop继承了Computer中的属性
Computer
}

// 定义"子类"中独有的方法
type LaptopClass interface {
Move() string
}

func (laptop Laptop) Move() string {
ret := fmt.Sprintf("%d 寸电脑被拿走了", laptop.ComputerSize)
return ret
}

// 重新实现一个PowerOff方法,覆盖父类的同名方法
func (laptop Laptop) PowerOff() string {
ret := fmt.Sprintf("%s 被合上了盖子", laptop.ComputerType)
return ret
}

func main() {
// 结构体实例化
var lap Laptop
// 显示的声明"父类"的属性
lap.Computer.ComputerType = "laptop"
// 隐式的声明"父类"的属性,效果与显示声明一样
// lap.ComputerType = "laptop"

// 声明子类的属性
lap.ComputerSize = 14

// 调用"父类"的PowerOff方法
fmt.Println(lap.Computer.PowerOff())
// 调用"子类"的PowerOff方法
fmt.Println(lap.PowerOff())
}
% go run main.go
laptop 关机
laptop 被合上了盖子

标签:入门,self,多态,golang,PowerOff,computer,父类,type,laptop
From: https://blog.51cto.com/830909/6064018

相关文章

  • python入门之列表推导式嵌套
    #传统写法:list01=["a","b","c"]list02=["A","B","C"]list03=[]forrinlist01:forcinlist02:list03.append(r+c)print(list03) ......
  • docker入门
    一、简介1.docker简介正常部署一个项目环境配置相当麻烦,jdk、mysql、redis等,比如换一台服务器需要重新配置可以利用docker的可移植性,将环境一模一样的复制Docker的出......
  • golang串口通讯
    com.gopackagemainimport( "encoding/hex" "errors" "io" "strings" "time" "github.com/jacobsa/go-serial/serial" log"github.com/sirupsen/logrus")/......
  • 第七章 Part5 多态
    多态多态基本概念多态是面向对象程序设计语言中数据抽象和继承之外的第三个基本特征。多态性(polymorphism)提供接口与具体实现之间的另一层隔离,从而将”what”和”how......
  • 软件架构师“从入门到入土”
    什么是架构?软件总体的结构,软件的设计图。为什么要出现架构?一个软件太大了,一个人的心力很难完全构建出来,以至于需要很长时间或者多人合作开发。一个人的话,一开始自己对......
  • python语法入门之与用户交互、运算符
    目录一、程序与用户交互1.什么是与用户交互用户交互就是人往计算机中input/输入数据,计算机print/输出结果2.为什么要与用户交互为了让计算机能够像人一样与用户沟通交......
  • Vue急速入门-3
    内容概要购物车小练习<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><title>Title</title><scriptsrc="vue/vue.js"></script><......
  • 深度理解变分自编码器(VAE) | 从入门到精通
    前言本文介绍了深度理解变分自编码器(VAE)的系列发展及相应的局限性。 本文转载自CVHub作者丨派派星 欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结......
  • PLC入门笔记11
    1.开关?输入拨杆开关、点动开关、常开、常闭开关霍尔接近开关(磁场N极导通3线+-DC24V)、电容接近开关(非金属)、电感接近开关(金属)2.输入接线?NPN型,不需要外接电源,直接短......
  • gin-快速入门
    转载自:https://gin-gonic.com/zh-cn/docs/quickstart/要求Go1.13及以上版本安装要安装Gin软件包,需要先安装Go并设置Go工作区。1.下载并安装gin:1$go......