oop - Golang OOP 说明
问题描述
我有两个接口go
,一个是另一个的子集
type x interface {
a()
}
type y interface {
a()
b()
}
我也有一个结构,它有这样的方法
type z struct {
some string
}
func (s z) a() {
// do stuff
}
func (s z) b() {
// do stuff
}
我对此有几个问题,即:
- 我是否正确地说 z 实现了 x 和 y?
- 以这种方式实现多个接口的一个结构的 OOP 概念是什么?
我试着问了几位同事,他们似乎倾向于polymorphism
作为答案,尽管他们不太确定。多态性的维基百科条目说它“是为不同类型的实体提供单一接口”,但这对我来说就像是直接相反。我还在其他来源(例如this)中发现 Go 是“不是真正的 OOP 语言”。
解决方案
是的,z
同时实现x
和y
。您可以通过使用变量声明将具体类型分配给接口类型来证明这一点:
var _ x = z{}
var _ y = z{}
这为您提供了编译时检查,以确保类型实现了您想要的接口。
附带说明一下,如果您明确想要y
成为x + some more methods
,那么这样写是有意义的:
interface y {
x
b()
}
关于命名,如果一个类型实现了两个共享一些方法的不同接口,我会称之为 - 一个实现两个不同接口的类型。一个接口是另一个接口的子集并不重要。
此外,在 Go 中,类型(也包括非结构类型)在定义时与接口无关。即使一个类型不是为了实现某个接口而编写的,您也可以通过定义具有不同名称和/或该类型方法的不同组合的新接口来使其实现任意数量的接口。这使得给概念命名变得更加困难 - 当接口可能稍后在另一个包中定义时,您如何知道类型定义时的名称?
推荐阅读
- python - 在 DateTimeIndex 中删除具有重复字符串值的行
- python - 我不明白第一行代码中第一个不正确的语句的用法?
- ios - 如何让 Firebase 动态链接与 App Clips 一起使用?
- javascript - 我的按钮组件在触发 css 动画后禁用。我怎样才能避免它?
- css - 在 Microsoft Edge 88.0.705.50 中滚动时 css 效果不起作用?
- c - 释放非 malloc 的内存
- python - 如何使用初始输入作为 SCons Phony 目标调用交互式 shell?
- node.js - 如何使用 Mongoose 查询数组中的子文档
- python - 如何“从头开始”构建一个只有 python 程序和基本 python 解释器的 docker 容器镜像?
- sql - 为在 PostgreSQL 中选择链接表的所有数据编写 SQL 查询的简单方法