gpt4 book ai didi

interface - 如何使用相同的方法签名实现两个不同的接口(interface)

转载 作者:IT王子 更新时间:2023-10-29 01:17:45 26 4
gpt4 key购买 nike

假设我必须实现在两个不同的包中声明的两个不同的接口(interface)(在两个不同的独立项目中)。

我在包 A

package A

type interface Doer {
Do() string
}

func FuncA(Doer doer) {
// Do some logic here using doer.Do() result

// The Doer interface that doer should implement,
// is the A.Doer
}

并且在包 B

package B

type interface Doer {
Do() string
}

function FuncB(Doer doer) {
// some logic using doer.Do() result

// The Doer interface that doer should implement,
// is the B.Doer
}

在我的 main 包中

package main

import (
"path/to/A"
"path/to/B"
)

type C int

// this method implement both A.Doer and B.Doer but
// the implementation of Do here is the one required by A !
func (c C) Do() string {
return "C now Imppement both A and B"
}

func main() {
c := C(0)
A.FuncA(c)
B.FuncB(c) // the logic implemented by C.Do method will causes a bug here !
}

如何处理这种情况?

最佳答案

作为FAQ mentions

Experience with other languages told us that having a variety of methods with the same name but different signatures was occasionally useful but that it could also be confusing and fragile in practice.
Matching only by name and requiring consistency in the types was a major simplifying decision in Go's type system.

在您的情况下,您会同时满足这两个接口(interface)。

你可以测试一个对象(接口(interface)类型)是否满足另一个接口(interface)类型A.Doer,方法是:

if _, ok := obj.(A.Doer); ok {
}

OP 添加:

But the logic implemented in the Do method to satisfy A is completely different from the one in B.

然后你需要在你的对象周围实现一个包装器:

  • 一个 DoerA,它有你的对象 C 作为一个字段,并以满足 A.Do() 的方式实现 code>A.Do()应该可以工作
  • 一个 DoerB,它有一个相同的对象 C 作为一个字段,并以满足如何实现的方式实现 B.Do() B.Do() 应该可以工作

这样,您就会知道将哪个 Doer 传递给需要 A.DoerB.Doer 的函数。
您不必在原始对象 C 上实现 Do() 方法,这将无法处理 A.Do( )B.Do()

关于interface - 如何使用相同的方法签名实现两个不同的接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28124412/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com