zoukankan      html  css  js  c++  java
  • 类的继承 设计模式

    类的继承
    简单来说就是一个类里面含有另一个类里面多有的特征,并且还有一些自己的东西,那么就可以说这个类是另一个类的继承

    基本概念:
    * 继承:一个类获得另一个类的所有特征,就可以称为继承
    * 派生:从一个已有的类产生一个新的类,就可以称为派生
    (继承和派生其实就是指同一件事情,只是从不同的角度来看待)
    * 父类/子类:以及存在的类为父类,从已有类为基础新生出来的类为子类。
    父类也称之为“基类”,子类也称之为“派生类”。
    * 单继承:一个类只能从一个上级类处继承特征信息(就像是一个孩子,正能有一个父亲),但上级类可以有多个子类(就像是一个父亲可以有多个孩子)
    * 扩展:在子类中需要再定义一些新的特征信息(属性、方法和常量),如果不扩展出新的特征信息,那么这个扩展也没有意义

    访问(权限)修饰符:
    访问的位置有三个:
    1、某个类的内部:指在本类中使用
    2、某个类的具有继承关系的子(父)类的内部:是指其他方法的某个类中
    3、某各类的外部:一般就是独立的代码区,不在任何类中
    *public:公共的(用这个修饰符修饰的成员可以在“任何位置”使用)
    *protected:受保护的,可以在当前类和与之具有继承关系的子(父)类中
    *private:私有的,只能在它自己所在的类中使用

    parent代表父类
    parent通常用于在子类中调用父类的成员的时候使用,多数通常就是使用父类的“静态类”的成员--因为parent代表的是类,不是对象
    parent常用的两种方法:
    class lei{
    public $v1 = 1;
    function fun(){
    echo "<br>这是父类,数据有:";
    echo "<br>lei中v1 = ".$this->v1;
    }
    function __construct($v1){
    $this->v1 = $v1;
    }
    }
    class lei2 extends lei{
    public $v2 = 2;
    function fun2(){
    echo "<br>这是子类,数据有:";
    //基本用法
    parent::fun();//调用父类的fun方法;
    echo "<br>lei2中v2=".$this->v2;
    }
    function __construct($v1,$v2){
    //经典用法;
    parent::__construct($v1);//调用父类的构造函数来初始化v1;
    $this->v2 = $v2;
    }
    }
    $dx = new lei2(10,20);
    $dx->fun2();



    构造方法和析构方法在继承中的表现:
    子类中没有定义构造方法时会调用父类的构造方法,所以在实例化子类时,需按照父类的构造方法的形式进行
    如果子类定义了自己的构造方法,则不会再去调用父类的构造方法,如果需要,也可以手动调用:parent::__construct();



    重写(override):
    重写,又叫覆盖,就是将从父类继承下来的属性或方法重新定义。

    举例:
    //创建一个类,作为父类
    class jizhuidongwu{
    //定义一个属性
    public $v1 = "具有脊椎";
    //定义一个方法
    function fun(){
    echo "<br>我是脊椎动物,特征为:";
    echo "<br>属性p1=".$this->v1;
    }
    }
    //创建子类
    class human extends jizhuidongwu{
    //重写(覆盖)掉父类的属性
    public $v1 = "具有28节脊椎骨的脊椎";
    public $v2 = "有32颗牙齿";
    //重写(覆盖)掉父类中的方法
    function fun(){
    echo "<br>我是人类,特征为:";
    //echo "<br>属性v1:".$this->v1;
    parent::fun();
    echo "<br>属性v2:".$this->v2;
    }
    }
    $dx = new human();
    $dx->fun();

    重写的基本要求:
    访问控制权限:
    下级的访问权限应该不低于上级的访问权限。
    比如:
    上级为 public(公共的):下级只能是public。
    上级为 protected(受保护的):下级就可以是protected和public。
    上级为 private(私有的) :下级就可以为public protected private。//但这种情况没有 实际意义
    方法的参数形式:
    方法的参数形式应该跟父类是相同的:
    比如:父类中的方法为:function($v1){}; 那么子类中的方法的参数只能是function($v1){};
    这时候子类中的方法参数不能是:function(){}; 也不能是 function($v1,$v2){};



    私有属性和私有方法的重写问题:私有属性和方法都不能覆盖
    但其实子类可以定义跟父类私有的同名属性或方法。
    只是当作一个自身的新的属性或方法来看待而已。不过方法的参数必须一致。




    构造方法的重写问题:构造方法不但可以像其他普通方法一样重写
    而且,比普通方法更宽松:重写的时候参数可以不一致。



    最终类final class:
    简单来说就是一个类 不想作为父类的时候,就可以把它作为一个最终类
    形式为:
    final class 类名{

    }
    最终方法 final method
    一个方法如果没有特别的声明,那么下级子类就可以对其进行重写(覆盖).
    如果你不想这个方法被下级类重写,就可以将其声明为最终方法。
    形式为:
    final function 方法名(){

    }
















    设计模式:
    什么叫设计模式:
    要求就是让代码易扩展,易维护,易复用。
    设计模式就是解决问题的常规做法,就是传说中的经验

    工厂模式:

    工厂就是一个类:
    形式:
    class A{
    var $a = "123";
    }
    class B{
    var $b = "123";
    }
    class C{
    var $c = "123";
    }
    // 定义一个工厂类 作用就是实例化对象
    class gongchang{
    static function fun($classname){
    return new $classname();
    }
    }

    $A = gongchang::fun("A");//获取一个A类的对象
    $B = gongchang::fun("B");//获取一个B类的对象
    $C = gongchang::fun("C");//获取一个C类的对象

    单例模式:
    某个类,只允许其“创建”出一个对象,即使去进行多次创建,也只能得到一个对象。
    三私一公。
    class B{
    public $v1 = 10;
    privatr static $instance;

    privatr function __construct(){}
    public static function getnew(){
    //如果本类中的$instance还没有数据
    if(!isset(B::$instance)){
    B::$instance = new self;
    }
    renturn B::$instance;
    }
    }
    $o1 = B::getnew();
    $o1-> = 100;
    $o2 = B::getnew();
    var_dump($o1);
    echo"<br>";
    var_dump($o2);
    echo "<br>o1中的v1为:".$o1->v1;
    echo "<br>o2中的v1为:".$o2->v1;

  • 相关阅读:
    ecplise自动提示失效,使用补全自动提示快捷键(Alt+/),但只显示“No Default Proposals”
    maven构建ssh工程
    pom.xml中坐标的组成
    依赖传递的规则
    maven中导入包版本冲突的解决
    maven工程的拆分与聚合
    maven的生命周期
    maven的常用命令
    在pom.xml中引入jar包坐标的依赖范围
    【stl的神奇操作】用集合搞定区间相交
  • 原文地址:https://www.cnblogs.com/LQK157/p/9142869.html
Copyright © 2011-2022 走看看