我有一个定义方法的接口。我有一个 实现 此接口的结构。在其中,我已经从该接口实现了方法,并且还定义了其他方法。
例如:
package main
import (
"fmt"
)
type Animal interface {
MakeNoise()
}
type Dog struct {
color string
}
/* Interface implementation */
func (d *Dog) MakeNoise() {
fmt.Println("Bark!")
}
/* End Interface implementation */
func (d *Dog) WagTail() {
fmt.Println(d.color + " dog: Wag wag")
}
func NewDog(color string) Animal {
return &Dog{color}
}
func main() {
dog := NewDog("Brown")
dog.MakeNoise()
dog.WagTail()
}
在操场上:https :
//play.golang.org/p/B1GgoNToNl_l
在此,WagTail()不是Animal接口的一部分,但属于Dog结构。运行此代码会出现错误
dog.WagTail未定义(动物类型没有字段或方法WagTail)。
有没有一种方法可以使结构坚持接口并定义其自己的方法?
该错误描述了这一切:
dog.WagTail未定义(动物类型没有字段或方法WagTail)
要实现一个接口,您应该实现在其内部定义的所有方法。
dog := NewDog("Brown")
dog.MakeNoise()
dog.WagTail()
现在NewDog
返回包含MakeNoise
方法但不包含的动物接口WagTail
。
管理需求的唯一方法是创建结构类型的变量,Dog
然后可以调用将Dog作为接收者的任何方法。
d := &Dog{"Brown"}
d.WagTail()
或者,您可以Dog
从NewDog
方法中返回指向struct 的指针,就像在注释中提到的代码中那样:
func NewDog(color string) *Dog {
return &Dog{color}
}
但是,如果未在接口中定义该方法,则无法使用struct作为方法接收者来实现它。
Golang提供了一种方法:
您可以要求编译器通过尝试使用T的零值或指向T的指针进行赋值(如果适用)来检查类型T是否实现了接口I。
type T struct{}
var _ I = T{} // Verify that T implements I.
var _ I = (*T)(nil) // Verify that *T implements I.
如果T(或* T,相应地)没有实现I,则在编译时会捕获该错误。
如果希望接口的用户显式声明他们实现了该接口,则可以在接口的方法集中添加一个具有描述性名称的方法。例如:
type Fooer interface {
Foo()
ImplementsFooer()
}
然后,类型必须将ImplementsFooer方法实现为Fooer,清楚地记录事实并在godoc的输出中宣布该事实。
type Bar struct{}
func (b Bar) ImplementsFooer() {}
func (b Bar) Foo() {}
大多数代码不使用此类约束,因为它们限制了接口概念的实用性。但是有时候,它们对于解决相似接口之间的歧义是必要的。
Override Method可以实现接口方法也可以覆写父类的方法,但Implement Methods只能实现接口方法 操作步骤: 菜单栏: Code —> Implement Methods 快捷键: Mac: control + L Windows\/Linux: Ctrl + I
我是C#新手,我不明白编译器为什么不抱怨这段代码。以下是类的层次结构: 执行代码: 执行时<代码>---- 当决定调用什么函数时--运行时还是编译时?如果我弄脏了一个新的< code>class CAble : IAble怎么办?
本文向大家介绍详解C#中对于接口的实现方式(隐式接口和显式接口),包括了详解C#中对于接口的实现方式(隐式接口和显式接口)的使用技巧和注意事项,需要的朋友参考一下 C#中对于接口的实现方式有隐式接口和显式接口两种: 隐式地实现接口成员 创建一个接口,IChinese,包含一个成员 Speak;我们创建一个类Speaker,实现接口Chinese 这个就是隐式实现接口。 隐式实现调用方法如下: 都可
问题内容: 在JDBC中,要连接和执行DB中的语句,我们主要使用Connection,Statement和ResultSet这两个接口。但是它们对应的对象后来用于运行诸如createStatement(),executeQuery(),next()等的方法。哪个类实现了这些方法?为什么将其称为连接对象而不是已实现的类对象? 问题答案: 在JDBC中,您首先需要通过调用来注册驱动程序 加载数据库类并
我试图重写ResponseErrorHandler接口,以便能够在2xx以外的任何响应情况下返回整个请求(状态代码、正文等)。 我注意到Spring(RestTemplate)默认情况下,如果响应不是2xx会返回异常。我不想返回异常,我只想能够返回: 但是我不明白如何在不更改方法返回的情况下返回ResponseEntity(我无法通过实现方法来实现)。 执行:
本文向大家介绍实现Runnable接口和Callable接口的区别?相关面试题,主要包含被问及实现Runnable接口和Callable接口的区别?时的应答技巧和注意事项,需要的朋友参考一下 如果想让线程池执行任务的话需要实现的Runnable接口或Callable接口。 Runnable接口或Callable接口实现类都可以被ThreadPoolExecutor或ScheduledThreadP