Java中有interface关键字,C++中有抽象类或纯虚类可以与interface比拟,C语言中也可以实现类似的特性。
在面试Java程序员时我经常问的一个问题是:通达信量化接口,接口和抽象类有什么区别。
很多编程书籍也经常说要面向通达信量化接口,接口编程,我的理解是,通达信量化接口,接口强制派生类必须实现基类定义的契约,而抽象类则允许实现继承从而导致派生类可以不实现基类定义的契约。通常这不是问题,但在有一些特定的情况,看起来不那么合适。
比如定义一个Shape基类,其中定义一个draw()方法,给一个什么都不做的默认实现,这实际没有任何意义。
再比如基类改变某个方法的实现,而派生类采用实现继承并没有重写这个方法,此时可能会导致一些奇怪的问题。以鸟为例,基类为Bird,我们可能会定义一个fly()方法,一个walk()方法,因为有的人认为鸟既可以走又可以飞。开始时我们在walk()的实现里作了假定,认为双脚交叉前进才是walk,可是后来发现有些鸟是双脚一齐蹦的,不会交叉前进。这个时候怎么办?基类Bird的walk()方法是否要修改、如何修改?
在C++中,没有通达信量化接口,接口关键字interface,同时为了代码复用,经常采用实现继承。在C语言中,我们前面几篇文章讨论了封装、隐藏、继承、虚函数、多态等概念,虽然都可以实现,但使用起来总不如自带这些特性的语言等得心应手。一旦你采用我们前面描述的方法来进行面向对象编程,就会发现,在C语言中正确的维护类层次是一件非常繁琐、容易出错的事情,而且要比面向对象的语言多写很多代码。但有一点,当我们使用C语言作面向对象编程时,比C++有明显的优势,那就是通达信量化接口,接口。
通达信量化接口,接口强制派生类实现,这点在C中很容易做到。而且我们在编程中,实际上多数时候也不需要那么多的继承层次,一个通达信量化接口,接口类作为基类,一个实现类继承通达信量化接口,接口类,这基本就够了。在C语言中采用这种方式,可以不考虑析构函数、超过3层继承的上下类型转换、虚函数调用回溯、虚函数表装配等等问题,我们所要做的,就是实现基类通达信量化接口,接口,通过基类指针,就只能操作继承层次中最底层的那个类的对象;而基类通达信量化接口,接口,天生就是不能实例化的。
一个示例如下:
struct base_interface {
void (*func1)(struct base_interface* b);
void (*func2)(struct base_interface* b);
int (*func_3)(struct base_interface* b, char * arg);
};
struct derived {
struct base_interface bi;
int x;
char ch;
char *name;
};
derived类可以提供一个构造函数new_derived,同时在实现文件中提供func_func_func_3的实现并将函数地址赋值给bi的成员,从而完成derived类的装配,实现base_interface定义的契约。
示例实现如下:
static void _derived_func_1(struct base_interface *bi)
{
struct derived * d = (struct derived*)bi;
d->x *= 2;
printf('d->name = %s
', d->name);
}
/* _derived_func_2 impl */
/* _derived_func_3 impl */
struct derived *new_derived()
{
struct derived *d = malloc(sizeof(struct derived));
d->bi.func_1 = _derived_func_1;
d->bi.func_2 = _derived_func_2;
d->bi.func_3 = _derived_func_3;
d->x = 0;
d->ch = 'a';
d->name = NULL;
return d;
}
void do_something(struct base_interface *bi)
{
bi->func_1(bi);
}
int main(int argc, char **argv)
{
struct derived * d = new_derived();
do_something((struct base_interface*)d);
return 0;
}
这种简单的方法也是我在自己的项目中使用的方法,效果不错。
好啦,C语言面向对象编程系列的基础性介绍就告一段落,下面是前几篇的链接,有兴趣的可以回头看看:
C语言面向对象编程:封装与继承C语言面向对象编程:继承详解C语言面向对象编程:虚函数与多态
接下来我会提供几个实作的例子,包括基本的数据结构,如单链表、树,还有一个httpserver的例子。
文章为作者独立观点,不代表股票交易接口观点
⒈⒉⒊...2022-08-22
0倍估值,政策打压的行业,风险还是大。涨跌不好说,葛大姐大赚不走,大跌加仓变巨亏,跟楼主一样,股票上头了