如何对变量使用多态性

时间:2019-09-23 19:30:42

标签: variables go polymorphism

我是Go语言的新手,开始学习多态性。
我知道当多个对象需要使用同一功能时该怎么做。
但是我有一个新问题,在不同对象上具有相同变量的情况下,我不知道该怎么办。

在以下示例中,我有两个不同的对象:struct1struct2。它们都具有相同的变量name
我可以对它们进行检查,并检查哪一个可以正常工作(您可以here对其进行测试):

package main

import (
    "fmt"
)
type struct1 struct {
    name string
}

type struct2 struct {
    name string
}

func main(){
    structMap := make(map[string]interface{})
    s1 := struct1{name:"struct1_name"}
    s2 := struct2{name:"struct2_name"}
    structMap["struct1"] = s1
    structMap["struct2"] = s2

    for key, _ := range structMap {
        switch key {
            case "struct1":
                generic := structMap[key].(struct1)
                fmt.Println(generic.name)
            case "struct2":
                generic := structMap[key].(struct2)
                fmt.Println(generic.name)
        }
    }
}

但是,如果我有20个对象?我需要做20张支票吗?
因此,我想知道是否可以使用变量进行接口操作,例如:

type genericStruct interfcae {
   name string
}

...
for key, _ := range structMap {
    generic := structMap[key].(genericStruct)
    fmt.Println(generic.name)

}

当然,此代码不起作用,因为我不知道该怎么做,但我想知道一种实现方法。

编辑:
我尝试根据以下示例使用界面: https://gobyexample.com/interfaces
感谢Robbie Milejczak和其他帮助我的人。

这是新的工作代码:

package main

import (
    "fmt"
)
type struct1 struct {
    name string
}

type struct2 struct {
    name string
}

type genericInterface interface {
    GetName() string
}

func (r struct1 ) GetName() string{
    return r.name
}

func (r struct2 ) GetName() string{
    return r.name
}

func printName(g interface{}){
    a := g.(genericInterface)
    fmt.Println(a.GetName())
}

func main(){
    structMap := make(map[string]interface{})
    s1 := struct1{name:"struct1_name"}
    s2 := struct2{name:"struct2_name"}
    structMap["struct1"] = s1
    structMap["struct2"] = s2

    for key, _ := range structMap {
    printName(structMap[key])
    }
}

1 个答案:

答案 0 :(得分:1)

对于这个人为的示例,您可以使用getters / setters而不是静态属性来利用接口:

type GenericStruct interface {
   GetName() string
}

现在,带有接收器GetName的任何结构都将满足GenericStruct接口:

type MyStruct struct {
  Name string
}

func (ms *MyStruct) GetName() string {
  return ms.Name
}

这可能会使更复杂的结构变得混乱,在这种情况下,您可能需要考虑构图建议(通常通过embedding实现)或第三方库(例如genny