golang继承与接口
继承
结构体
Go语言的结构体(struct)和其他语言的类(class)有同等的地位,但Go语言放弃了包括继 承在内的大量面向对象特性,只保留了组合(composition)这个最基础的特性。 组合甚至不能算面向对象特性,因为在C语言这样的过程式编程语言中,也有结构体,也有组合。组合只是形成复合类型的基础。
type Rect struct {
x, y float64
width, height float64
}
简单继承
package main
import (
"fmt"
)
type Father struct {
MingZi string
}
func (this *Father) Say() string {
return "大家好,我叫 " + this.MingZi
}
type Child struct {
Father
}
func main() {
c := new(Child)
c.MingZi = "小明"
fmt.Println(c.Say())
}
多重继承
package main
import (
"fmt"
)
type Father struct {
MingZi string
}
func (this *Father) Say() string {
return "大家好,我叫 " + this.MingZi
}
type Mother struct {
Name string
}
func (this *Mother) Say() string {
return "Hello, my name is " + this.Name
}
type Child struct {
Father
Mother
}
func main() {
c := new(Child)
c.MingZi = "小明"
c.Name = "xiaoming"
fmt.Println(c.Father.Say())
fmt.Println(c.Mother.Say())
}
名字冲突问题
package main
import(
"fmt"
)
type X struct {
Name string
}
type Y struct {
X
Name string //相同名字的属性名会覆盖父类的属性
}
func main(){
y := Y{X{"XChenys"},"YChenys"}
fmt.Println("y.Name = ",y.Name) //y.Name = YChenys
}
所有的Y类型的Name成员的访问都只会访问到最外层的那个Name变量,X.Name变量相当于被覆盖了,可以用y.X.Name引用
接口
在Go语言中,一个类只需要实现了接口要求的所有函数,我们就说这个类实现了该接口,
根据《Go 语言中的方法,接口和嵌入类型》的描述可以看出,接口去调用结构体的方法时需要针对接受者的不同去区分,即:
- 接收者是指针*T时,接口实例必须是指针
- 接收者是值 T时,接口实力可以是指针也可以是值
- 接口的定义和类型转换与接收者的定义是关联的
接口继承
栗子:
package main
import (
"fmt"
)
type Action interface {
Sing()
}
type Cat struct {
}
type Dog struct {
}
func (*Cat) Sing() {
fmt.Println("Cat is singing")
}
func (*Dog) Sing() {
fmt.Println("Dog is singing")
}
func Asing(a Action) {
a.Sing()
}
func main() {
cat := new(Cat)
dog := new(Dog)
Asing(cat)
Asing(dog)
}
接口使用
栗子:
package main
import "fmt"
type Type struct {
name string
}
type PType struct {
name string
}
type Inter iInterface {
post()
}
// 接收者非指针
func (t Type) post() {
fmt.Println("POST")
}
// 接收者是指针
func (t *PType) post() {
fmt.Println("POST")
}
func main()
{
var it Inter
//var it *Inter //接口不能定义为指针
pty := new(Type)
ty := {"type"}
it = ty // 将变量赋值给接口,OK
it.post() // 接口调用方法,OK
it = pty // 把指针变量赋值给接口,OK
it.post() // 接口调用方法,OK
pty2 := new(PType)
ty2 := {"ptype"}
it = ty2 // 将变量赋值给接口,error
it.post() // 接口调用方法,error
it = pty2 // 把指针变量赋值给接口,OK
it.post() // 接口调用方法,OK
}
作者:吃猫的鱼0
链接:https://www.jianshu.com/p/fe8c366dcd1d
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
golang继承与接口的更多相关文章
- Javascript面向对象特性实现封装、继承、接口详细案例——进级高手篇
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- C#类继承和接口继承时一些模棱两可的问题[转]
原文地址:http://www.cnblogs.com/harleyhu/archive/2012/11/29/2794809.html 1.在father定义的方法若含有virtual关键字,chi ...
- Java继承和接口
接口最关键的作用,也是使用接口最重要的一个原因:能上溯造型至多个基础类.使用接口的第二个原因与使用抽象基础类的原因是一样的:防止客户程序员制作这个类的一个对象,以及规定它仅仅是一个接口.这样便带来了一 ...
- 基础学习day07---面向对象三---继承,接口与 抽象类
一.继承 1.1.继承概念 将对象的共性抽取出来.提取出一个单独的类. 继承使用复用以前的代码非常容易,能够大大的缩短开发周期,降低开发成本,同时增加程序的易维护性 继承使重一个类A能够直接使用另外一 ...
- java 类的继承和接口的继承
父类 public class person { String name; int age; void eat(){ System.out.println("吃饭"); } voi ...
- Effective C++ 笔记:条款 34 实现继承和接口继承
Differentiate between inheritance of interface and inheritance of implementation. 行为含义 声明一个pure virt ...
- 【C# 复习总结】类、继承和接口
1 类 定义新的数据类型以及这些新的数据类型进行相互操作的方法 定义方式: class Cat { } class Cat:object { } C#中所有的类都是默认由object类派生来的,显示指 ...
- Javascript面向对象特性实现封装、继承、接口详细案例
Javascript面向对象特性实现(封装.继承.接口) Javascript作为弱类型语言,和Java.php等服务端脚本语言相比,拥有极强的灵活性.对于小型的web需求,在编写javascript ...
- java基础知识总结--继承和接口
什么是继承?什么是接口?他们之间的区别和联系是什么? 什么是继承? 继承是使用已存在的类的定义作为基础建立新类的技术,新类的定义可以增加新的数据或新的功能,也可以用父类的功能.多个类中存在相同属性和行 ...
随机推荐
- 《流畅的Python》 A Pythonic Object--第9章
Python的数据模型data model, 用户可以创建自定义类型,并且运行起来像内建类型一样自然. 即不是靠继承,而是duck typing. 支持用内建函数来创建可选的对象表现形式.例如repr ...
- java中的文件上传下载
java中文件上传下载原理 学习内容 文件上传下载原理 底层代码实现文件上传下载 SmartUpload组件 Struts2实现文件上传下载 富文本编辑器文件上传下载 扩展及延伸 学习本门课程需要掌握 ...
- Linux新手到大佬系列——1
站长资讯平台:Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和Unix的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的Unix工具软件.应用程序和网络协议 ...
- LOJ2265. 「CTSC2017」最长上升子序列
题意:中文题意很清楚 LOJ2263 分析: 根据Dilworth定理,最小链覆盖=最长反链. 问题转化为求 $k$ 个最小不上升序列能覆盖的最大数的个数. 参考链接: 1. https://blog ...
- Codeforces Round #551 (Div. 2) E. Serval and Snake (交互题)
人生第一次交互题ac! 其实比较水 容易发现如果查询的矩阵里面包含一个端点,得到的值是奇数:否则是偶数. 所以只要花2*n次查询每一行和每一列,找出其中查询答案为奇数的行和列,就表示这一行有一个端点. ...
- 001_linux驱动之_驱动的加载和卸载
(一)驱动的安装: 1. 可以将驱动程序静态编译进内内核中 2. 也可以将它作为模块在使用的时候再加载 注:在配置内核时候,如果某个配置被设置为m,就表示它将会被编译成模块 (二)加载和卸载驱动使 ...
- 【概率论】3-2:连续分布(Continuous Distributions)
title: [概率论]3-2:连续分布(Continuous Distributions) categories: Mathematic Probability keywords: Continuo ...
- Echarts案例-柱状图
一:先在官网下载 https://www.echartsjs.com/zh/download.html 然后再建立工程,导入这两个包: 写代码: <!DOCTYPE html> <h ...
- Python学习日记(四)——Python基本数据类型梳理(int、str、list、tuple、dict)
数字(int) 1.创建方式 n1 = 123 n2 = int(123) 2.内存分配 #共同用一个内存地址的情况 n1 = 123 n2 = n1 #用两个内存地址的情况 n1 = 123 n2 ...
- Python实现进度条的效果
from itertools import cycle from time import sleep for frame in cycle(r'-\|/-\|/'): print('\r', fram ...