zoukankan      html  css  js  c++  java
  • PHP 抽象类实现接口注意事项(含PHP与.Net的区别)

    最近在学习Drupal8,看到源码里面一个抽象类BlockBase实现了一个接口BlockPluginInterface,但是并没有实现该接口的所有方法。然后我就不淡定了,因为之前是做.NET的,记忆中 “接口中定义的方法必须在继承类中全部实现”,可是Drupal8的源码的确摆在这里,不可能错啊。于是赶紧翻了下《PHP与MySql程序设计》书中关于接口的部分,看到书中赫然写着:

    当类通过 implements 关键字 实现 了接口后,就完成了一个契约。接口中的所有方法都必须实现,倘若实现类没有实现所有方法,则必须声明为抽象类,否则将出现下面所示的致命错误··· ”

    譬如,下面这段代码是不会报错的,结果仍然会输出“hello world!”

    <?php  
    
    interface ITest{
        public function func1();
        
        public function func2();
    }
    
    abstract class classtest implements ITest{}
    
    echo "hello world!";

    因为类“classtest”是抽象类,所以不会报错。

    基础不牢,会怀疑人生的啊,还得多读书啊~

    但是虽然没有显式地实现接口,但是接口的两个方法已经被抽象类继承(或者说默认实现了。个人觉得没有做任何操作,就拥有了接口的方法,用继承更贴切一些吧)了,这一点可以通过函数get_class_methods 加以验证:

    <?php  
    
    interface ITest{
        public function func1();
        
        public function func2();
    }
    
    abstract class classtest implements ITest{}
    
    print_r( get_class_methods('classtest'));

      结果是:

    Array ( [0] => func1 [1] => func2 )

    -----------------------------------------------------我是低调的分割线,对.NET不感兴趣的童鞋可以止步了~----------------------------------------------------

    补充说一下,在.NET中,即使是抽象类,继承接口的话,也必须实现接口,这一点和PHP不同。实现的方法大致有两种:一种是直接实现,需要写出方法体;另一种是抽象实现,即虽然实现了,但是是以抽象函数的方式实现的,抽象函数是没有方法体的,参考代码如下:

     interface ITest
        {
            void func1();
    
            int func2 ();
        }
    
        abstract class a_class_1 : ITest
        {
            public void func1()//显示实现,有方法体
            {
                throw new NotImplementedException();
            }
    
            public int func2()
            {
                throw new NotImplementedException();
            }
        }
    
        abstract class a_class_2 : ITest
        {
            public abstract void func1();//抽象方式实现,抽象函数没有方法体
            public abstract int func2();
        }
    View Code
  • 相关阅读:
    nodeJS grunt karma+jasmine+require 快速构建前台自动化测试环境搭建
    js闭包
    白鹭 接入vivo小游戏
    白鹭 字节跳动 接入小游戏
    白鹭声音播放问题汇总
    白鹭 有人好奇为什么hashcode 增长的那么快么?都创建了些什么?
    Mac node 安装
    白鹭 修改底层 egret.js 库后再次编译 成 新的库
    js 获取字典长度
    egret 性能优化
  • 原文地址:https://www.cnblogs.com/zjfblog/p/8384277.html
Copyright © 2011-2022 走看看