dongwen5336 2017-08-29 16:25
浏览 23
已采纳

一个接口,多种实现

How do I translate the following Java code to Go?

interface NamePrinter {
    void print();
}

class NamePrinterWithoutGreeting implements NamePrinter {
    private string name;

    public NamePrinterWithoutGreeting(string name) {
        this.name = name;
    }

    public void print() {
        System.out.println(this.name);
    }
}

class NamePrinterWithGreeting implements NamePrinter {
    private string name;

    public NamePrinterWithoutGreeting(string name) {
        this.name = name;
    }

    public void print() {
        System.out.println("Hello, " + this.name);
    }
}

Type NamePrinter can reference an instance of both NamePrinterWithoutGreeting and NamePrinterWithGreeting:

void main(String[] args) {
    a NamePrinter = new NamePrinterWithoutGreeting("Joe");
    b NamePrinter = new NamePrinterWithGreeting("Joe");

    a.print(); // prints "Joe"
    b.print(); // prints "Hello, Joe"
}

Back to go... I'd like to have an interface of type NamePrinter that could reference many different implementations... but I don't know how to do it. Here below is an implementation... but it is fine for just one case:

type Person struct {
    name string
}

type NamePrinter interface {
    Create(name string)
    Print()
}

func Create(name string) *Person {
    n := Person{name}
    return &n
}

func (p *Person) print() {
    fmt.Println(p.name)
}

func main() {
    p := Create("joe")
    fmt.Println(p.Print())
}

Thank you.

  • 写回答

1条回答 默认 最新

  • drxdai15012937753 2017-08-29 16:33
    关注

    Any type that you define, and on which you implement a set of methods that are equal in their signatures to those defined by an interface, that type can be used in place where you expect that interface.

    type NamePrinter interface {
        print()
    }
    
    type NamePrinterWithoutGreeting struct {
        name string
    }
    
    func (p *NamePrinterWithoutGreeting) print() {
        fmt.Println(p.name)
    }
    
    type NamePrinterWithGreeting struct {
        name string
    }
    
    func (p *NamePrinterWithGreeting) print() {
        fmt.Println("Hello, ", p.name)
    }
    
    type MyInt int
    
    func (i MyInt) print() {
        fmt.Printf("Hello, %d
    ", i)
    }
    
    type MyFunc func() string
    
    func (f MyFunc) print() {
        fmt.Println("Hello,", f())
    }
    func main() {
        var a NamePrinter = &NamePrinterWithoutGreeting{"joe"}
        var b NamePrinter = &NamePrinterWithGreeting{"joe"}
        var i NamePrinter = MyInt(2345)
        var f NamePrinter = MyFunc(func() string { return "funk" })
        a.print()
        b.print()
        i.print()
        f.print()
    }
    

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 从Freecad中宏下载的DesignSPHysics,出现如下问题是什么原因导致的(语言-python)
  • ¥30 notepad++ 自定义代码补全提示
  • ¥15 MATLAB有限差分法解一维边值问题
  • ¥200 内网渗透测试 横向渗透 Windows漏洞 Windows权限维持
  • ¥15 数据结构图的相关代码实现
  • ¥15 python中aiohttp.client_exceptions.ContentTypeError
  • ¥30 DeepLung肺结节检测生成最大froc值对应的epoch报错
  • ¥15 信号发生器如何将频率调大,步尽值改成10
  • ¥15 keil 5 编程智能家具,风扇台灯开关,人体感应等
  • ¥100 找一名渗透方面的专家