zoukankan      html  css  js  c++  java
  • PHP5中interface 和 abstract class 的区别

    什么是 abstract class
    PHP 5 引入抽象类和方法。抽象类不能被实例化。任何类只要包含有抽象方法(即使只有一个抽象方法)就必须也被定义为抽象。定义为抽象的方法只需要简单的声明而不用实现。
    从抽象类继承的时候,所有父类中标记为抽象方法的声明都必须在子类中定义;此外,这些方法还必须用相同的(或更弱的)访问控制。比如,如果抽象方法定义为保护(protected),函数实现必须被定义为protected或者public

    抽象类例子:
    abstract class AbstractClass{
        // Force Extending class to define this method
        abstract protected function getValue();
        abstract protected function prefixValue($prefix);
    
        // Common method
        public function printOut() {
            print $this->getValue() . "\n";
        }
    }
    
    class ConcreteClass1 extends AbstractClass{
        protected function getValue() {
            return "ConcreteClass1";
        }
    
        public function prefixValue($prefix) {
            return "{$prefix}ConcreteClass1";
        }
    }
    
    class ConcreteClass2 extends AbstractClass{
        public function getValue() {
            return "ConcreteClass2";
        }
    
        public function prefixValue($prefix) {
            return "{$prefix}ConcreteClass2";
        }
    }
    
    $class1 = new ConcreteClass1;
    $class1->printOut();
    echo $class1->prefixValue('FOO_') ."\n";
    
    $class2 = new ConcreteClass2;
    $class2->printOut();
    echo $class2->prefixValue('FOO_') ."\n";                    

     

    什么是 interface
    Object Interface 对象接口允许你创建这种代码,一个类必须实现的指定方法,而又不必定义这些方法如何处理。接口使用interface关键字定义,和标准类定义一样,但是任何方法都没有内容。接口内所有的方法声明都必须为公开(public),这是接口的本质(呵呵,所谓接口嘛,就是用于交互的)。
    实现
    要实现一个接口,使用 implements 操作符。接口中的所有方法都必须在一个类中实现;不这么做会导致一个致命错误(fatal error)。 如果想要的话,使用逗号分隔每个接口,一个类可以实现多个接口。
    注意:一个类不能实现两个有同样函数名的接口,因为这导致这个函数的含义模糊。

    接口的例子:
    // Declare the interface 'iTemplate'
    interface iTemplate{
        public function setVariable($name, $var);
        public function getHtml($template);
    }
    
    // Implement the interface
    // This will work
    class Template implements iTemplate{
        private $vars = array();
    
        public function setVariable($name, $var){
            $this->vars[$name] = $var;
        }
    
        public function getHtml($template){
            foreach($this->vars as $name => $value) {
                $template = str_replace('{' . $name . '}', $value, $template);
          }
            return $template;
        }
    }
    
    // This will not work
    // Fatal error: Class BadTemplate contains 1 abstract methods
    // and must therefore be declared abstract (iTemplate::getHtml)
    class BadTemplate implements iTemplate{
        private $vars = array();
    
        public function setVariable($name, $var){
            $this->vars[$name] = $var;
        }
    }
    
    实现多个接口:
    class MyClass implements anInterface, anotherInterface {
    //...
    }
    
    如果想要继承一个类并实现一个接口,先使用“extends”然后“implements”:
    class MyChildClass extends MyParentClass implements MyInterface
    {
    // definition
    }

    interface 和 abstract class 的区别
    PHP 5 中类没有多重继承,但可以实现多个接口。这应该是接口的主要用途。这点和Java类似,和C++不同。应该是学java,对多重继承的一种解决方式吧。

    代码形式上来说,接口只是一个声明,其方法没有任何实现代码;抽象类的方法既可以没有实现代码,也可以拥有实现代码。

     

  • 相关阅读:
    利用JavaScript+DIV+CSS实现下拉菜单。当鼠标移动到菜单选项的时候显示对应的DIV:function show(menu)。当鼠标移出的时候隐藏所有的DIV:function hide()。
    java编程——图片旋转
    名言
    利用CSS对注册页面实现修饰
    软件过程
    Warning: Failed to halt at after bootloader, forced stop at
    cc2650 7x7封装更换为 5X5 4x4
    IAR 路径导致的错误
    cc2650-cc2640蓝牙开发准备手记
    window10装机 nvem简介,针对于 联想R720系列
  • 原文地址:https://www.cnblogs.com/toxiaonan/p/2728133.html
Copyright © 2011-2022 走看看