类的继承 接口interface/implements

 继承:

关键字:extends,使一个类继承并拥有另一个已经存在类的成员属性和方法,被继承的类称为父类或基类,继承类为子类;

public:       方法或者属性在任何作用域下都可以访问到,而且是默认的,如果没有为一个属性或方法指定访问修饰符,它将是public。
protected:本类和子类可以访问,外部对象不可以调用。
private:      只能在本类访问,子类与外部对象都不可能调用。经过private标记的方法或者属性可以在继承类中重新定义,每一个类只能看到它自己定义                          的私有方法。

<?php
    header(‘content-type:text/html;charset=utf8‘);
    class father{
        protected $name;
        function __construct($name){
            //构造函数
            $this->name=$name;
        }
        function work(){
              echo "{$this->name}我在工作";
          }
          function __destruct(){
              //析构函数
          }
    }
    class son extends father{
        //继承父类
        function play(){
            echo "{$this->name}我在玩游戏";
        }
    }
    $my_father=new father("爸爸");  //创建父类对象  $my_father->work();
    $my_son=new son("儿子");
    $my_son->work();
    $my_son->play();
?>

PHP类是单继承,也就是不支持多继承,当一个类需要多个类的功能时,继承就无能为力了,为此PHP引入了接口技术;

一个类可以继承多个接口;一个类只能继承一个抽象类;

接口interface/implements:

接口定义:如果一个抽象类里面的所有方法都是抽象方法,且没有声明变量,而且接口里面所有的成员都是public权限的,那么这种特殊的抽象类就叫接口;

接口使用interface关键字定义,并使用implements来实现接口的方法,且必须完全实现;

实现一个接口:

<?php
interface Fruit{
    const MAX_WEIGHT = 5;   //此处不用声明,就是一个静态常量
    function setName($name);
    function getName();
}
//实现接口
class Apple implements Fruit{
    private $name;
    function getName() {
        return $this->name;
    }
    function setName($_name) {
        $this->name = $_name;
    }
}

$apple = new Apple(); //创建对象
$apple->setName("苹果");
echo "创建了一个" . $apple->getName();
echo "<br />";
echo "MAX_GRADE is " . Apple::MAX_WEIGHT;   //静态常量
?>

实现多个接口:

<?php
    interface IEmployee{...}
    interface IDeveloper{...}
    interface IPillage{...}
    class Employee implements IEmployee,IDeveloper,iPillage {
        ...
    }
    class Contractor implements IEmployee,IDeveloper {
        ...
    }
?> 

抽象类和接口的区别
接口是一个特殊的抽象类,也可以看作是一个模型的规范。接口与抽象类大致区别如下:

一个子类如果implements一个接口,就必须实现接口中的所有方法(不管是否需要);如果继承一个抽象类,只需要实现需要的方法即可;
   
如果一个接口中定义的方法名改变了,那么所有实现此接口的子类需要同步更新方法名;而抽象类中如果方法名改变了,其子类对应的方法名将不受影响,     只是变成了一个新的方法而已;
   
抽象类只能单继承,当一个子类需要实现的功能需要继承多个父类时,就必须使用接口;

时间: 2024-10-19 15:35:55

类的继承 接口interface/implements的相关文章

浅谈Java接口(Interface)

浅谈Java接口 先不谈接口,不妨设想一个问题? 如果你写了个Animal类,有许多类继承了他,包括Hippo(河马), Dog, Wolf, Cat, Tiger这几个类.你把这几个类拿给别人用,但是别人想给动物加上宠物功能,要怎么办呢? 根据以往的知识,我们可以: 把Pet方法加入Animal类 这样所有的子类都有Pet方法,以后新继承Animal的动物也有这个方法. 这个方案很简单,但是这个方案也很操蛋.为什么? 有人会养河马吗?有人会养狼养狮子吗?不太行. 如果都是Pet方法,狗需要遛,

C# 浅谈 接口(Interface)的作用

继承"基类"跟继承"接口"都能实现某些相同的功能,但有些接口能够完成的功能是只用基类无法实现的 1.接口用于描述一组类的公共方法/公共属性. 它不实现任何的方法或属性,只是告诉继承它的类 <至少>要实现哪些功能,继承它的类可以增加自己的方法. 2.使用接口可以使继承它的类: 命名统一/规范,易于维护.比如: 两个类 "狗"和"猫",如果它们都继承了接口"动物",其中动物里面有个方法Behavio

Rommel - C# 浅谈 接口(Interface)的作用

鉴于网上太多太多的对C# 接口的误解,想来想去还是自己做一个完美的接口 篇章 继承"基类"跟继承"接口"都能实现某些相同的功能,但有些接口能够完成的功能是只用基类无法实现的 1.接口用于描述一组类的公共方法/公共属性. 它不实现任何的方法或属性,只是告诉继承它的类 <至少>要实现哪些功能,继承它的类可以增加自己的方法. 2.使用接口可以使继承它的类: 命名统一/规范,易于维护.比如: 两个类 "狗"和"猫",如果它

【Java面试题】60 接口是否可继承接口? 抽象类是否可实现(implements)接口? 抽象类是否可继承具体类(concrete class)? 抽象类中是否可以有静态的main方法?

接口可以继承接口.抽象类可以实现(implements)接口,抽象类可以继承具体类.抽象类中可以有静态的main方法. 问:  抽象类是否可继承实体类 (concrete class) 答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数. 答案很明确,可以继承.其实从Object就是个实体类,Java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的. 关键在于这答案里所说的"前提是实体类必须有明确的构造函数"一句,是什么意思.

15、接口是否可继承接口?抽象类是否可实现(implements)接口?抽象类是否可继承具体类(concreteclass)?抽象类中是否可以有静态的main方法?

接口可以继承接口.抽象类可以实现(implements)接口,抽象类可以继承具体类.抽象类中可以有静态的main方法. 问:  抽象类是否可继承实体类 (concrete class) 答: 抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数. 答案很明确,可以继承.其实从Object就是个实体类,Java的API文档里,每个抽象类的条目里都明确写着直接或间接继承自Object,所以这点是没有疑问的. 关键在于这答案里所说的“前提是实体类必须有明确的构造函数”一句,是什么意思. 一般学习

JAVA之旅(七)——final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展

JAVA之旅(七)--final关键字 , 抽象类abstract,模板方法模式,接口interface,implements,特点,扩展 OK,我们继续学习JAVA,美滋滋的 一.final 我们来聊聊final这个关键字 final可以修饰类,方法和变量 final修饰的类不可以被继承 final修饰的方法不可以被覆盖 final修饰的变量是一个常量,只能被赋值一次 内部类只能访问被final修饰的局部变量 final,故名思意,就是最终的意思,由以上的五种特性,不过final的出现,也是有

PHP类的继承和接口

PHP类的继承的一些语法 -PHP的类只支持单继承,就是每个类最多只能有一个父类或者没有父类. -子类不能继承父类使用private修饰的成员. 修饰符 可访问范围 public 当前类.子类和类外 protected 当前类和子类 private 当前类 类的类型 含义 被final修饰的类 只能实例化不能被继承 被abstract修饰的类 只能被继承不能被实例化 注意: 被final修饰的方法不能被子类重写. -通常要被子类继承的成员都使用protected,其余的尽量使用private,把

类的继承,抽象类,接口,方法重写和重载

类的继承 C#与java:1.C#中继承用“:”,Java中继承用extends2.重写父类的方法,C#中需要关键字override,Java中不需要3.C#中调用父类的成员用base,Java中使用super4.子类的构造方法中如果没有显示的调用父类的构造方法,   编译器会自动在第一行代码添加super() 抽象类: 1.含有抽象方法的类必须是抽象类,抽象类中不一定有抽象方法2.抽象类的子类如果是抽象类,可以不需要重写父类的抽象方法3.抽象类不能被实例化,构造方法和静态方法不能是抽象的 接口

python3 面向对象、类、继承、组合、派生、接口、子类重用父类方法

对象是特征(变量)与技能(函数)的结合体而类是一系列对象共同的特征与技能的集合体 class teacher: lesson = "python" def __init__(self,name,color,age): # 只干初始化的活 self.name = name if not isinstance(name,str): raise TypeError self.color = color self.age = age def jineng(self): print('新技能')