相同点
- 代码复用:传统继承通过子类继承父类,子类可复用父类的属性和方法。Go语言接口嵌套时,被嵌套接口的方法会被包含在新接口中,新接口的实现类型也可复用这些方法逻辑,在一定程度上实现了代码复用。
- 多态性:传统继承体系中,子类对象可赋值给父类类型变量,根据实际对象类型调用对应方法实现多态。Go语言中,一个类型实现了某个接口,该类型的实例就可当作此接口类型使用,通过接口嵌套形成的复杂接口同样具备这种多态特性。
不同点
- 实现方式
- 传统继承:是通过类之间的父子关系来实现,子类继承父类的属性和方法,是一种强耦合的关系。
- Go接口嵌套:是通过接口之间的组合来实现,一个接口可嵌套多个其他接口,实现类型只需实现这些接口中的方法,耦合度相对较低。
- 继承结构
- 传统继承:通常形成树形结构,一个子类只能有一个直接父类,但可多层继承。
- Go接口嵌套:结构更灵活,不局限于树形,可根据需求自由组合不同接口,一个类型可实现多个接口,一个接口也可被多个类型实现。
- 访问控制
- 传统继承:有明确的访问修饰符(如public、private、protected等)来控制父类成员在子类中的访问权限。
- Go语言:没有传统的访问修饰符概念,通过首字母大小写来控制包内和包外可见性,接口嵌套时方法可见性遵循此规则,没有针对继承关系的特殊访问控制。
适合使用接口嵌套模拟继承的场景
- 分层抽象场景:在一个电商系统中,有订单处理模块。可定义基本的
OrderBase
接口处理订单基础操作(如订单创建、保存),再定义PaidOrder
接口嵌套OrderBase
接口并添加支付相关方法(如支付、退款),ShippedOrder
接口嵌套OrderBase
接口并添加发货相关方法(如发货、物流跟踪)。不同的订单处理逻辑类型可分别实现这些接口,实现分层抽象和功能复用。
type OrderBase interface {
CreateOrder() error
SaveOrder() error
}
type PaidOrder interface {
OrderBase
Pay() error
Refund() error
}
type ShippedOrder interface {
OrderBase
Ship() error
Track() string
}
type NormalOrder struct{}
func (no NormalOrder) CreateOrder() error {
// 实现创建订单逻辑
return nil
}
func (no NormalOrder) SaveOrder() error {
// 实现保存订单逻辑
return nil
}
type PaidNormalOrder struct{ NormalOrder }
func (pno PaidNormalOrder) Pay() error {
// 实现支付逻辑
return nil
}
func (pno PaidNormalOrder) Refund() error {
// 实现退款逻辑
return nil
}
- 功能扩展场景:假设开发图形绘制库,定义
Shape
接口表示基本图形(如包含绘制方法Draw
),Fillable
接口表示可填充图形(包含填充方法Fill
)。Rectangle
类型如果既要是基本图形又要是可填充图形,就可通过实现Shape
和Fillable
接口(可通过嵌套这两个接口到新接口FillableShape
来统一管理),实现功能扩展。
type Shape interface {
Draw()
}
type Fillable interface {
Fill()
}
type FillableShape interface {
Shape
Fillable
}
type Rectangle struct{}
func (r Rectangle) Draw() {
// 实现绘制矩形逻辑
}
func (r Rectangle) Fill() {
// 实现填充矩形逻辑
}