oop - 如何实现功能共享相同逻辑的接口?
问题描述
我想为以下接口提供多种实现:
type API interface {
A()
B()
C()
}
根据我的用例,所有实现都应该为函数A和B共享完全相同的逻辑,而函数C对不同的实现有不同的逻辑。
因此,我创建了以下要嵌入的通用实现:
type Common struct {}
func (c *Common) A() {}
func (c *Common) B() {}
要为上面的接口创建两个实现,我可以执行以下操作:
type FirstImpl struct { Common }
func (i *FirstImpl) C() {}
type SecondImpl struct { Common }
func (i *SecondImpl) C() {}
一切正常,直到我发现需要在函数B中调用函数C。请注意,函数B的逻辑在两个实现中应该仍然相同,尽管我们可能会在B中调用C得到不同的结果。
我想知道这是否是 Go 中的一种常见模式,以及是否有一种优雅的方式来处理它。
解决方案
您想模拟后期绑定。
实现这一点的一种方法是使用函数指针和实现的构造函数:
type CommonImpl struct {
cimpl func()
}
func (c CommonImpl) C() { c.cimpl() }
type FirstImpl struct {
CommonImpl
}
func NewFirstImpl() APIImpl {
ret:=FirstImpl{}
ret.cimpl=ret.c
return &ret
}
使用此实现,您可以调用派生类型C()
。
另一种方法是将函数作为参数传递:
func (c CommonImpl) C(bfunc func()) {
}
...
x:=FirstImpl{}
x.C(x.B)
或使用接口:
type BIntf interface {
B()
}
func (c CommonImpl) C(b BIntf) {
}
x:=FirstImpl{}
x.C(x)
推荐阅读
- desktop-bridge - UWP c++ winrt 应用程序显示 SHGDNF 在 ShObjldl_core.h 中未识别
- css - 如何使图片下方的文字居中
- sql - SQL Server 根据值计算连续的前行
- python - Python openpyxl表格样式将表格转换为范围
- javascript - 使用 JS 在硬件中设置硬件配置位
- huawei-mobile-services - 由于 Skybox 制作程序未与开发文档中的示例代码一起发布,因此无法集成 HMS 计算机图形套件示例代码
- zillow - Zillow API 返回 410 响应
- java - 在Java中,变量或参数可以设置子类的父类吗?
- asp.net - "ErrorMessage":"找不到 ABCGeckoWP.exe。"
- php - 随机替换字符串中的单词