英文:
Go lang - Polymorphism for interface; array of types which implement interface
问题
我来自Java背景,对Go的面向对象编程(OOP)方法感到有些迷茫。我正在尝试编写一个日志记录函数,基本上可以接受一个数组,该数组可以是一种类型或另一种类型。为了澄清:数组中不会混合类型,它们将是全部为Type1或Type2的数组。
我为这两种类型创建了一个接口供它们实现,但是我的IDE表示不能将类型用作接口。在这里,有什么更好、更符合Go风格的方法吗?
type Loggable interface {
GetFirstName() string
GetLastName() string
}
type Person1 struct {
FirstName string
LastName string
}
func (t Person1) GetFirstName() string {
return t.FirstName
}
func (t Person1) GetLastName() string {
return t.LastName
}
type Person2 struct {
FirstName2 string
LastName2 string
}
func (t Person2) GetFirstName() string {
return t.FirstName2
}
func (t Person2) GetLastName() string {
return t.LastName2
}
func performLogging(logger LoggingPackage.Logger, loggingList []Loggable){
for _, person := range loggingList {
logger.Logf("Person is %s %s", person.GetFirstName(), person.GetLastName())
}
}
func relevantFunction() {
personList := handler.PersonRequest() // 返回一个全部为Person1或全部为Person2的数组
performLogging(logger, personList) // 无法将[]Person1或[]Person2用作[]Loggable
}
英文:
I'm coming from a Java background, so I'm pretty lost by Go's approach to OOP. I'm trying to write a logging function that, fundamentally, can accept an array of either one type or another. To clarify: the arrays will not mix type, they will be an array of all either Type1 or Type 2.
I created an interface for both these types to implement, but my IDE said it can't use the type as the interface. What's the better, more Go-like approach here?
type Loggable interface {
GetFirstName() string
GetLastName() string
}
type Person1 struct {
FirstName string
LastName string
}
func (t Person1) GetFirstName() string {
return t.FirstName
}
func (t Person1) GetLastName() string {
return t.LastName
}
type Person2 struct {
FirstName2 string
LastName2 string
}
func (t Person2) GetFirstName() string {
return t.FirstName2
}
func (t Person2) GetLastName() string {
return t.LastName2
}
func performLogging(logger LoggingPackage.Logger, loggingList []Loggable){
for _, person := range loggingList {
logger.Logf("Person is %s %s", person.GetFirstName(), person.GetLastName())
}
}
func relevantFunction() {
personList := handler.PersonRequest() // returns an array of all either Person1, or all Person2
performLogging(logger, personList) // can't use []Person1 or []Person2 as []Loggable
}```
</details>
# 答案1
**得分**: 2
我发现在这些情况下,将与问题无关的所有代码删除会有所帮助。这个例子按预期工作:
~~~
package main
import "fmt"
type Loggable interface {
GetFirstName() string
}
type Person1 struct { FirstName string }
func (t Person1) GetFirstName() string { return t.FirstName }
type Person2 struct { FirstName2 string }
func (t Person2) GetFirstName() string { return t.FirstName2 }
func performLogging(loggingList []Loggable){
for _, person := range loggingList {
fmt.Println(person.GetFirstName())
}
}
func main() {
people := []Loggable{
Person1{"Angela"}, Person2{"Tyrell"},
}
performLogging(people)
}
~~~
<details>
<summary>英文:</summary>
I find it helps in these cases to rip out all code that is not central to the
problem. This example works as expected:
~~~
package main
import "fmt"
type Loggable interface {
GetFirstName() string
}
type Person1 struct { FirstName string }
func (t Person1) GetFirstName() string { return t.FirstName }
type Person2 struct { FirstName2 string }
func (t Person2) GetFirstName() string { return t.FirstName2 }
func performLogging(loggingList []Loggable){
for _, person := range loggingList {
fmt.Println(person.GetFirstName())
}
}
func main() {
people := []Loggable{
Person1{"Angela"}, Person2{"Tyrell"},
}
performLogging(people)
}
~~~
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论