dongxinyue2817 2016-06-24 13:29
浏览 64
已采纳

无需重复自己即可在Go中编写界面代码

Suppose I have two pets, a cat named Lucy and a dog named Fido. I have taught them both the same trick, "speak".

In the future I would like to obtain more pets, and teach them different tricks, so in anticipation, I've coded to an interface:

package main                                                                 

import "fmt"                                                                 

type Pet interface {                                                         
        speak() string                                                       
}                                                                            

type Dog struct {                                                            
        speech string                                                        
}                                                                            

type Cat struct {                                                            
        speech string                                                        
}                                                                            

func (c Cat) speak() string {                                                
        return c.speech                                                      
}                                                                            

func (d Dog) speak() string {                                                
        return d.speech                                                      
}                                                                            

func getSpeech(p Pet) string {                                               
        return p.speak()                                                     
}                                                                            

func main() {                                                                
        Fido := Dog{"woof"}                                                  
        Lucy := Cat{"meow"}                                                  

        fmt.Println("Fido says:", getSpeech(Fido)) // Fido says: woof
        fmt.Println("Lucy says:", getSpeech(Lucy)) // Lucy says: meow
} 

Now, although this works well, it seems unnecessarily verbose. I'm clearly repeating myself. Also, assuming all Dogs say "woof" and all Cats say "meow", is it idiomatic to initialize the string inside the struct?

How would you re-factor this code to be more DRY without losing the benefit of an interface?

  • 写回答

2条回答 默认 最新

  • duanpan3166 2016-06-24 14:17
    关注

    You can embed a base type in some cases to delegate common fields and methods. This is not inheritance, it is only a form of automatic delegation via composition. Don't try to use this to create type hierarchies like you would in a java-style OOP language.

    Here you can delegate the speak method to the Speaker type. In practice this is less useful because the Speaker and its methods have no relationship to the struct where they are embedded, i.e. a Speaker doesn't know which type it's speaking for, nor which individual instance.

    https://play.golang.org/p/Bof92jZsNh

    type Speaker struct {
        Saying string
    }
    
    func (s Speaker) speak() string {
        return s.Saying
    }
    
    type Pet interface {
        speak() string
    }
    
    type Dog struct {
        Speaker
    }
    
    type Cat struct {
        Speaker
    }
    
    func getSpeech(p Pet) string {
        return p.speak()
    }
    
    func main() {
        Fido := Dog{Speaker{Saying: "woof"}}
        Lucy := Cat{Speaker{Saying: "meow"}}
    
        fmt.Println("Fido says:", getSpeech(Fido)) // Fido says: woof
        fmt.Println("Lucy says:", getSpeech(Lucy)) // Lucy says: meow
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题
  • ¥15 matlab中使用gurobi时报错
  • ¥15 这个主板怎么能扩出一两个sata口
  • ¥15 不是,这到底错哪儿了😭
  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么