假设我有以下通用接口:
type Iface[T any] interface {
MyFunc(T)
}
我想实现“适配器”或“转换器”类,它有助于在不同类型的接口之间进行转换。本质上,它包装了
Iface[A]
,使其表现得像 Iface[B]
:
type Adapter[A any, B any] interface {
Adapt(Iface[A]) Iface[B]
}
所以,我不知道如何编写
Adapt
函数:
type Iface[T any] interface {
MyFunc(T)
}
type Adapter[A any, B any] interface {
Adapt(Iface[A]) Iface[B]
}
type StringToIntAdapter struct {
}
func (StringToIntAdapter) Adapt(Iface[string]) Iface[Int] {
// ???
}
我认为我需要以某种方式在适配器内部动态创建接口的新实例。但我找不到任何关于如何做到这一点的提示。
诸如
Iface[string]
之类的接口是通过声明 MyFunc(string)
方法的类型来实现的。同样,Iface[int]
由声明 MyFunc(int)
的类型实现。
您的问题和您的
Adapt
函数相当于问“如何在具有 MyFunc(string)
方法的类型与具有 MyFunc(int)
方法的类型之间转换?”。
抽象来说,这是没有意义的。接口描述了一种行为。要在接口之间进行转换,实现类型要么表现出两种行为,要么不表现出两种行为。
如果它表现出两种行为,例如该类型同时具有
MyFunc(string)
和 MyFunc(int)
方法,您可以通过断言将一个接口更改为另一个接口。
var a Iface[string] = // ... assign some concrete value
var b Iface[int] = a.(Iface[int])
如果类型不表现出这两种行为,则您定义的
Adapt
方法无法工作。您必须指定实现 Iface[T]
的类型如何将其行为更改为另一个 Iface[U]
。
例如通过定义附加接口:
type Convertable[T, U any] interface {
Iface[T]
Convert() Iface[U]
}
func Adapt(v Convertable[string, int]) Iface[int] {
return v.Convert()
}
这强制要求您传递给
Adapt
的任何类型都会实现一种将自身更改为所需输出接口的方法。然后,每种类型都必须通过实现 Convert() Iface[U]
方法来指定自己的逻辑。