81-继承与实现接口

原创 2016年04月28日 21:56:33

81-继承与实现接口

在定义一个类时往往会使其继承某个父类或者实现某个接口,在扩展中实现这个功能非常方便。下面我先给出PHP语言中的代码。

<?php
interface i_myinterface
{
    public function hello();
}

class parent_class implements i_myinterface
{
    public function hello()
    {
        echo "Good Morning!\n";
    }
}

final class myclass extends parent_class
{
    public function call_hello()
    {
        $this->hello();
    }
}
?>

上面的代码我们已经非常熟悉了,它们在PHP扩展中的实现应该是这样的:

//三个zend_class_entry
zend_class_entry *i_myinterface_ce,*parent_class_ce,*myclass_ce;

//parent_class的hello方法
ZEND_METHOD(parent_class,hello)
{
    php_printf("hello world!\n");
}

//myclass的call_hello方法
ZEND_METHOD(myclass,call_hello)
{
    //这里涉及到如何调用对象的方法,详细内容下一章叙述
    zval *this_zval;
    this_zval = getThis();
    zend_call_method_with_0_params(&this_zval,myclass_ce,NULL,"hello",NULL);
}

//各自的zend_function_entry
static zend_function_entry i_myinterface_method[]={
    ZEND_ABSTRACT_ME(i_myinterface, hello,  NULL)
    {NULL,NULL,NULL}
};

static zend_function_entry parent_class_method[]={
    ZEND_ME(parent_class,hello,NULL,ZEND_ACC_PUBLIC)
    {NULL,NULL,NULL}
};

static zend_function_entry myclass_method[]={
    ZEND_ME(myclass,call_hello,NULL,ZEND_ACC_PUBLIC)
    {NULL,NULL,NULL}
};

ZEND_MINIT_FUNCTION(test)
{
    zend_class_entry ce,p_ce,i_ce;
    INIT_CLASS_ENTRY(i_ce,"i_myinterface",i_myinterface_method);
    i_myinterface_ce = zend_register_internal_interface(&i_ce TSRMLS_CC);


    //定义父类,最后使用zend_class_implements函数声明它实现的接口
    INIT_CLASS_ENTRY(p_ce,"parent_class",parent_class_method);
    parent_class_ce = zend_register_internal_class(&p_ce TSRMLS_CC);
    zend_class_implements(parent_class_ce TSRMLS_CC,1,i_myinterface_ce);

    //定义子类,使用zend_register_internal_class_ex函数
    INIT_CLASS_ENTRY(ce,"myclass",myclass_method);
    myclass_ce = zend_register_internal_class_ex(&ce,parent_class_ce,"parent_class" TSRMLS_CC);
    //注意:ZEND_ACC_FINAL是用来修饰方法的,而ZEND_ACC_FINAL_CLASS是用来修饰类的
    myclass_ce->ce_flags |= ZEND_ACC_FINAL_CLASS;
    return SUCCESS;
}

这样,当我们在PHP语言中进行如下操作时,便会得到预期的输出:

<?php
$obj = new myclass();
$obj->hello();
/*
输出内容:
walu@walu-ThinkPad-Edge:/cnan/program/php-5.3.6/ext/test$ php test.php 
hello world!
*/
?>

这里的ZEND_ABSTRACT_ME()宏函数比较特殊,它会声明一个abstract public类型的函数,这个函数不需要我们实现,因此也就不需要相应的ZEND_METHOD(i_myinterface,hello){…}的实现。一般来说,一个接口是不能设计出某个非public类型的方法的,因为接口暴露给使用者的都应该是一些公开的信息。不过如果你非要这么设计,那也不是办不到,只要别用ZEND_ABSTRACT_ME()宏函数就行了,而用它的底层实现ZEND_FN()宏函数。

//它可以对应<?php ...public static function apply_request();...的接口方法声明。
static zend_function_entry i_myinterface[]=
{
    ZEND_FENTRY(apply_request, NULL, NULL, ZEND_ACC_STATIC|ZEND_ACC_ABSTRACT|ZEND_ACC_PUBLIC)
    {NULL,NULL,NULL}
};

这样,只要掩码中有ZEND_ACC_ABSTRACT,便代表是一个不需要具体实现的方法。ZEND_FENTRY其实是ZEND_ME和ZEND_FE的最终实现,现在我们把这一组宏罗列在这一次展开,供你参考使用。

#define ZEND_FENTRY(zend_name, name, arg_info, flags)   { #zend_name, name, arg_info, (zend_uint) (sizeof(arg_info)/sizeof(struct _zend_arg_info)-1), flags },

#define ZEND_FN(name) zif_##name

#define ZEND_MN(name) zim_##name

#define ZEND_FE(name, arg_info)                     ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0)

#define ZEND_ME(classname, name, arg_info, flags)   ZEND_FENTRY(name, ZEND_MN(classname##_##name), arg_info, flags)

C++接口继承与实现继承的区别和选择

1.接口继承与实现继承的区别《Effective C++》条款三十四:区分接口继承和实现继承中介绍的比较啰嗦,概括地说需要理解三点: (1)纯虚函数只提供接口继承,但可以被实现; (2)虚函数既提...
  • K346K346
  • K346K346
  • 2017年02月13日 16:34
  • 609

条款34 区分接口继承和实现继承

总结: 1.  接口继承&实现继承不同。在public继承之下,derived classes总是继承base class的接口。 2.  pure virtual纯虚函数只具体指定接...
  • u013074465
  • u013074465
  • 2015年07月06日 09:03
  • 667

Java ——基础之继承与接口的区别

Java 基础之继承与接口的区别 抽象类:抽象类体现了数据抽象的思想,是实现多态的一种机制。它定义了一组抽象的方法,至于这组抽象方法的具体表现形式由派生类来实现。同时抽象类提供了继承的概念,...
  • zouzhigang96
  • zouzhigang96
  • 2016年01月06日 15:14
  • 6825

Java有了继承,为什么还要接口

显示世界里有多重继承的需求,如下图。猫和狗分属不同的科目,但是它们都是宠物。它们应该有宠物类的共有行为。 看上去猫和狗需要也继承宠物类,如果宠物类与动物类都继承一种生物类,势必出现菱形继承情况。如...
  • IBelieve1974
  • IBelieve1974
  • 2017年03月03日 10:19
  • 611

java继承类与实现接口

java 继承 接口
  • hy771213
  • hy771213
  • 2017年03月29日 22:56
  • 1706

关于接口的多继承的理解

为何JAVA中类不能多继承,而接口可以多继承呢? Java语言是面向对象的:Java语言提供类、接口和继承等原语,为了简单起见,只支持类之间的单继承,但支持接口之间的多继承,并支持类与接口之间的实现机...
  • colaYeah
  • colaYeah
  • 2017年01月17日 15:26
  • 1044

PHP实现接口多继承

在PHP的面向对象中,接口可以继承接口。PHP类只能继承一个父类(单继承),但是接口可以实现多继承,可以继承一个或者多个接口。当然接口的继承也是和类的继承一样使用extends关键字,要多个继承的话只...
  • gu_wen_jie
  • gu_wen_jie
  • 2017年06月13日 16:53
  • 328

Java运行时多态性:继承和接口的实现

转载地址:Java运行时多态性:继承和接口的实现 Java做为一个面向对象语言的最强大机制:运行时多态性。两个实现方式分别是继承和接口。Java是面向对象的语言,而运行时多态性是面向对象程序设计代码...
  • u011026329
  • u011026329
  • 2015年08月24日 08:54
  • 1348

C#OOP之八 继承 接口和抽象类

继承 在现实生活中有所谓的“种瓜得瓜、种豆得豆”的说法,在生物学概念上就是“遗传”的概念,在面向对象中“继承”就类似于生物学中的遗传,通过继承,可以更好的实现代码的重用(复用,多次使用的意思)、增加...
  • zhangchen124
  • zhangchen124
  • 2016年04月28日 18:24
  • 3981

Kotlin类、继承、接口实现

继续学习基础package net.edaibu.kotlintest.ClassAndExtends /** * Created by ${GEQIPENG} on 2017/5/23. */...
  • sinat_35241409
  • sinat_35241409
  • 2017年05月23日 11:41
  • 2297
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:81-继承与实现接口
举报原因:
原因补充:

(最多只允许输入30个字)