golang 的重载要怎么实现? 只有组合,不就要重写许多代码?

3,204 views
Skip to first unread message

软刀

unread,
Aug 10, 2013, 4:19:47 PM8/10/13
to golang-china
貌似golang 中只有组合,没有重载耶, 这样的话,不就很多代码不能复用??

package main

import "fmt"

type A int

func (p A) L() {
        // 假设大量的逻辑代码写在这里 
    p.P()
}
func (p A) P() {  // 这里则是希用重载的代码
    fmt.Print("A\n")
}

type B struct {
    A
}
func (p B) P() {      // 以为和其他语言一样,可以重载某个方法
    fmt.Print("B\n")
}

func main() {
    b := new(B)
    b.P()
    b.L()     // 我这里期望的结果是打印  B ,但是得到的结果却是 A
}

谢谢啦 

软刀

unread,
Aug 10, 2013, 4:27:11 PM8/10/13
to golang-china

软刀

unread,
Aug 10, 2013, 9:53:02 PM8/10/13
to golang-china
我想到了

如果出现这种情况,说明我的代码设计有问题

逻辑的那段代码应该要分离出来 
构造成一个依赖于某个接口的类

软刀

unread,
Aug 11, 2013, 5:06:58 AM8/11/13
to golang-china
想了想,好像又不对

设计总是会不周全的

David DENG

unread,
Aug 11, 2013, 9:57:52 PM8/11/13
to golang...@googlegroups.com
基本上就是这个思路: http://play.golang.org/p/L47LEkj_0v

David

软刀

unread,
Aug 12, 2013, 7:17:47 AM8/12/13
to golang-china
谢谢了 被以前卡壳了,总想着一个类重载某个方法


--
--
官网: http://golang-china.org/
IRC: irc.freenode.net #golang-china
@golangchina
 
---
您收到此邮件是因为您订阅了 Google 网上论坛的“Golang-China”论坛。
要退订此论坛并停止接收此论坛的电子邮件,请发送电子邮件到 golang-china...@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/groups/opt_out。

steve wang

unread,
Aug 12, 2013, 7:56:58 AM8/12/13
to golang...@googlegroups.com
类重载也是一样的啊。
某个类组合一个接口,在自己的函数里调用这个接口;这个类和它的“子类”都可以实现这个接口,这样就是重载了。

软刀

unread,
Aug 12, 2013, 12:35:17 PM8/12/13
to golang-china
不好意思,没看懂。能不能给个代码运行下

我按照理解的 写了段代码  http://play.golang.org/p/IZN6NG3oN3

但是可能我没理解你说的

steve wang

unread,
Aug 12, 2013, 1:15:11 PM8/12/13
to golang...@googlegroups.com

David DENG

unread,
Aug 12, 2013, 10:38:11 PM8/12/13
to golang...@googlegroups.com
还是建议你在写 Go 程序把之前的一些概念忘掉,彻底的忘掉:继承、虚函数、重载、多态性。

Go 支持所谓的嵌入,其实只是可以把若干个数据结构组合在一起而已,嵌入的方法有时候会自动的实现从而可以省一些代码,但是还是得从数据结构组合的角度去理解,这里几乎没有方法的继承。不要为了“继承”方法而嵌入,嵌入是为了数据。

比如你的例子代码,所有的嵌入都是没必要的。

David

On Tuesday, August 13, 2013 12:35:17 AM UTC+8, 软刀 wrote:

steve wang

unread,
Aug 13, 2013, 12:06:39 AM8/13/13
to golang...@googlegroups.com
有点不同意见。
关于通过“继承”(实际上是组合)实现方法重用,我认为还是挺常见和必要的范式。

steve wang

unread,
Aug 13, 2013, 12:14:28 AM8/13/13
to golang...@googlegroups.com
举一个bufio里的例子:
type ReadWriter struct {
*Reader
*Writer

David DENG

unread,
Aug 13, 2013, 1:27:23 AM8/13/13
to golang...@googlegroups.com
按照命名规则,这里应该是 interface  而不是 struct,我觉得 interface 的嵌入和继承的确差不多,呵呵。

如果是  struct,这里我还是觉得应该理解成数据的集成。因为 Reader 读的还是自己的数据,Writer 写的也是自己的,和对方以及 ReadWriter 都没有关系。只是编译器把 ReadWriter 也加上了两个类已经实现的方法而已,理解成 ReadWriter 继承了 *Reader 同时继承了 *Writer 很多时候反倒会产生一些错觉。

David

软刀

unread,
Aug 13, 2013, 2:47:29 AM8/13/13
to golang-china
再想想sql driver ... mysql 等

代码的重用是基于接口的,不是基于类的
嗯,感觉就是面向接口编程而不是面向对象编程

然后对象是嵌套的,不是继承的,虽然有同样的方法可以调用,但是调用的方法还是基于那个被嵌套的对象,与嵌套者无关


:)

steve wang

unread,
Aug 13, 2013, 3:06:37 AM8/13/13
to golang...@googlegroups.com
如果代码的重用是基于接口,那么这个算什么?
buf := bytes.NewBuffer(nil)
buf是一个接口吗?还是一个struct?

David DENG

unread,
Aug 13, 2013, 3:14:15 AM8/13/13
to golang...@googlegroups.com
这部分代码的重用其实就和子程序一样的,写好一个东西,改用的时候就用了,呵呵。

David

steve wang

unread,
Aug 13, 2013, 3:53:21 AM8/13/13
to golang...@googlegroups.com
使用一个子程序或者函数是代码重用,使用一个struct也是代码重用。
所以我的意思是,代码重用并不是基于接口的。

David DENG

unread,
Aug 13, 2013, 4:23:20 AM8/13/13
to golang...@googlegroups.com
怎么说都行,具体问题具体分析,能够把问题解决就好了,呵呵

David

软刀

unread,
Aug 13, 2013, 5:58:50 AM8/13/13
to golang-china
代码的重用,一般是某段代码写好了,然后发现有个东西改变了,然后其他地方不用改变就可以继续用了(一般是只要调用以及组合他们(这两段代码),但是不用去修改原先的代码)


如果代码的重用是基于接口,那么这个算什么?
buf := bytes.NewBuffer(nil)
buf是一个接口吗?还是一个struct?

这个暂时我也不清楚要怎么归类,buf是一个Buffer结构的东西,但是上面这一段,没有涉及到某段代码的修改,看不出哪里重用了

steve wang

unread,
Aug 13, 2013, 7:10:23 AM8/13/13
to golang...@googlegroups.com
请看维基对于代码重用(code reuse)的定义[1]:
Code reuse, also called software reuse, is the use of existing software, or software knowledge, to build new software.
代码重用有很多种形式,其中特别提到:
The software library is a good example of code reuse.
而我举的例子中的bytes.Buffer就是很典型的go语言标准库中的组件(struct)。

你说的“代码重用”,按照我的理解实际上是指代码的可维护性:即当需求变化的时候,代码要易于修改和实现。这和代码重用有一定的关系,但并不是代码重用。

软刀

unread,
Aug 13, 2013, 10:13:29 AM8/13/13
to golang-china

在 2013年8月13日下午7:10,steve wang <steve....@gmail.com>写道:
你说的“代码重用”,按照我的理解实际上是指代码的可维护性:即当需求变化的时候,代码要易于修改和实现。这和代码重用有一定的关系,但并不是代码重用。

Reply all
Reply to author
Forward
0 new messages