编码到C中的接口

时间:2016-07-19 14:32:55

标签: c interface

如何在Go中编程到C界面?

转到代码:

package measure
type Weighable interface {
    Weigh() float64
}
func Weight(w Weighable) float64 {
    return w.Weigh()
}

现在任何具有返回float64的Weigh()方法的类型都被视为" Weighable"。

package planet 
type Info struct {
    volume float
    density float
}
func (own *Info) Weigh() float64 {
    return own.volume * own.density
}

因为行星是可以称重的,我可以称它()它。

package main
import "measure", "planet"

func main() {
    Earth := &planet.Info{1097509500, 5.51}
    EarthWeight = measure.Weight(Earth) 
}

现在任何东西,人或亚原子粒子都可以被不同地称重,但可以使用相同的代码调用, measure.Weight(Person) measure.Weight(subatomicParticle)

问题:

定义函数签名的头文件似乎是正确的方法,但是以接口作为参数的函数呢?这可以用C语言完成,还是有更好的方法?

2 个答案:

答案 0 :(得分:4)

你不能。那不是程序的意图。如果您想要面向对象的功能,则最接近的是

中,您可以使用纯虚拟方法编写class es,它们不需要在您将其声明为纯虚拟的类中实现

public:
    virtual int pure_virtual_method() = 0;
    //                                ^ this means PURE VIRTUAL

然后任何继承自此类的类必须实现pure_virtual_method()

这正是接口的含义,例如 java 语言中所理解的。您有一个具有预定义但未实现的方法的类的框架,您从该框架派生类被强制为某些方法提供实现。这非常优雅,几乎是我唯一喜欢的

注意:我知道有一个面向对象的库,但它真的很麻烦,我从来都不喜欢它们的制作方式{ {3}}" 面向对象"。继承是可能的,但对我来说太复杂了。

答案 1 :(得分:2)

在C中,您可以实现这样的功能表(in fact, OLE technologies are implemented using this principle):

User.GetPropertiesAsync()

注意函数必须如何具有指向适当对象的指针... C ++编译器在实例方法中生成此隐藏参数,而关键字this指向该参数。这个例子只是为了说明原理。希望它会有所帮助: - )