当前位置: 首页 > 面试题库 >

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

景嘉实
2023-03-14
问题内容

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

我有包装 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 !
}

如何处理这种情况?


问题答案:

正如常见问题解答所提到的

其他语言的经验告诉我们,使用具有相同名称但签名不同的多种方法有时会很有用,但在实践中也可能会造成混淆和脆弱。
在Go的类型系统中,仅按名称进行匹配并要求类型一致是简化的主要决定

在您的情况下,您将满足两个接口。

您可以通过执行以下操作来测试对象(接口类型)是否满足另一种接口类型A.Doer

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

OP添加:

但是,用这种Do方法实现的逻辑与中的A完全不同B

然后,您需要围绕对象实现包装器:

  • a DoerA,将您的对象C作为字段,并A.Do()以满足应如何A.Do()工作的方式实施
  • a DoerB,它具有与C字段相同的对象,并且B.Do()以满足B.Do()应该如何工作的方式实现

这样,您将知道将哪个Doer传递给期望an A.Doer或a 的函数B.Doer
您将不必Do()在原始对象上实现一个方法C,该方法将无法应对A.Do()and 的不同逻辑B.Do()



 类似资料:
  • 问题内容: 我有两个Java接口和一个实现类。 (我已经使用Eclipse直接运行程序,并且我没有尝试通过从命令行进行显式编译来检查任何编译器警告等)。 为什么它们运行没有问题?为什么Java允许这样做,即使它满足两个接口的“合同”,却在实现类时造成歧义? 更新了示例。 问题答案: Java语言规范的第8.1.5节专门允许这种情况: 类中的单个方法声明可以实现多个超级接口的方法。例如,在代码中:

  • 问题内容: 假设我有两个接口: 如果我想同时实现它们,那么将使用哪种实现? 问题答案: 这是一个编译时错误。您不能从两个接口获得两个实现。 但是,如果在中实现该方法,则是正确的: 我只想补充一点,即使I1中的方法是抽象的,而I2中的方法是默认的,您也无法实现它们两者。因此,这也是一个编译时错误:

  • 问题内容: 说我有两个结构: 我希望他们都实现接口A: 像这样对First和Second结构都实现似乎是多余的: 有没有一种方法可以为实现接口A的所有结构提供一个实现?像这样的东西,但似乎不起作用: 谢谢! 问题答案: 不,您不能, 但是 您可以创建一个基本类型,然后将其嵌入到您的2结构中,因此只需要一个基本类型的实现即可: 用法: 操场上的完整例子 嵌入文件

  • 我有一个采访问题-C#,是否可以在一个类中实现,从接口继承有两个具有相同名称和相同签名的方法?

  • 问题内容: 此代码完美地工作。方法test()适用于两个接口。幕后到底发生了什么?在实际情况下,此功能有何用处? 问题答案: 因为它是一个接口,所以不会造成任何危害。通过实现和,您基本上是在为您的课程使用蓝图。双方并说,应实施一个名为方法 您的类实现了该方法,因此接口已完成其工作。 基本上,您的班级在说:“哦,我需要因为接口而实现”,然后您就实现了。然后您的班级说:“哦,嘿,由于接口我需要再次实现

  • public final fun():myclass中定义的字符串 公共抽象乐趣getTheString():myclass中定义的字符串 我还有一个错误:类'MyClass'不是抽象的,并且没有实现MyInterface中定义的抽象成员公共抽象乐趣getTheString():String。 所以我有几个问题: null