重写override

Posted xiaowie

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重写override相关的知识,希望对你有一定的参考价值。

思考:子列可以从父类进行继承,那如果子类与父类的成员重名了怎么办?

引入:首先,类中定义的成员是允许出现与其他类同名的,但是这个过程如果出现了继承,那么重名就存在重写的问题。

 

重写override【掌握】

定义:重写,即子类中定义了与父类重名的成员,子类可以重写父类任意类成员,通常重写是用来重写父类的方法;用于扩展或者更改某些业务逻辑。

1.基类继承父类,同时子类定义与父类同名的类成员。,重写父类成员之后,子类只会直接访问子类的成员(覆盖)

<?php

class posen{
   public $name="posen";
   public function show(){
      echo __CLASS__.$this->name;
   }
}

class man extends posen{
   //我们在定义跟父类一样的成员就可以实现重写
   public $name="man";            //重写成员
   public function show(){        //重写方法
      echo __CLASS__.$this->name;
   }
}


$s=new man();
echo $s->name;   //输出 man
echo ‘<hr>‘; 
$s->show();     //输出 man  man  都是子类中的方法和属性


?>

注意:不管是共有和受保护属性,一旦重写,父类的就会不存在,二私有属性不会被覆盖而丢失

<?php

class posen{
   private $count=100;   //此成员不会被子类重写而丢失
   public $name="posen";
   public function show(){
      echo __CLASS__.$this->name;
   }
}

class man extends posen{          //重写后将会有2个$count 1个name  1个show  而继承过来的name和show将会覆盖掉而私有不会覆盖
   //我们在定义跟父类一样的成员就可以实现重写
   public $name="man";            //重写成员
   private $count=1;
   public function show(){        //重写方法
      echo __CLASS__.$this->name;
   }
}

$s=new man();
echo $s->name;   //输出 man
echo ‘<hr>‘; 
$s->show();     //输出 man  man  都是子类中的方法和属性

?>

3.重写的要求,子类重写父类的方法,控制权不能高于父类,即子类可以比父类更开放。

<?php

class posen{
   private $count=100;   
   public $name="posen";
   public function show(){
      echo __CLASS__.$this->name;
   }
}

class man extends posen{          
 
   private $name="man";          
   private $count=1;
   public function show(){       
      echo __CLASS__.$this->name;
   }
}

   $s=new man();
   $s->show();   //报错  Access level to man::$name must be public (as in class posen) 控制权不能高于父类
   // 父类是公开的,而你重写后 变成私有  高于了父类的控制权

?>

4.重写要求2:php重写要求子类重写父类方法的时候,必须保证与父类同名方法参数一致

<?php

class posen{
   private $count=100;   
   public $name="posen";
   public function show($a){
      echo __CLASS__.$this->name;
   }
}

class man extends posen{          
 
   public $name="man";          
   private $count=1;
   public function show(){       
      echo __CLASS__.$this->name;
   }
}

   $s=new man();
   $s->show();   //错误,与父类同名方法参数不一致

?>

注意:在方法参数一致不单单是数量一致,而且数据类型要求也必须相同,但形参名可以不同,另外,在php7以前重写对于参数这块没有要求

5.重写要求3:重写针对的是被继承的成员,父类私有方法不会被继承,因此不受要求2规定。

因为都不会被继承了,所以不受要求,如果子类中创建了一样的和父类中的方法名,而父类为私有(不被继承),也不会报错。

 

6.重写是指子类拥有特殊的情况,一般是需要在父类的基础上进行扩展,此时如果想要继续保证父类被重写的方法继续执行(默认

永远只能方法子类重写的方法),需要在子类重写方法的时候使用parent关键字。

<?php

class posen{
   private $count=100;   
   public $name="posen";
   public function show(){
      echo __CLASS__.$this->name;
   }
}

class man extends posen{          
 
   public $name="man";          
   private $count=1;
   public function show(){       
      echo __CLASS__.$this->name;
      echo ‘<hr>‘;
      // 强制调用父类被重写的方法
      parent::show();
   }

}

   $s=new man();
   $s->show();   //错误,与父类同名方法参数不一致

?>

注意:parent不能访问父类属性,可以访问静态属性,静态方法类常量和普通方法。

总结:

1.重写override是一种在子类中i当以父类同名成员的操作

2.公有。受保护属性重写是直接覆盖父类成员,私有属性不会被覆盖,公有,受保护的方法会被重写,但是私有方法不会被重写,因此私有方法不会被继承

3.重写的要求

    1.子类控制权不能高于父类控制权

    2.php7中要求被重写的方法必须与父类保持参数一致(数量和类型也一样)

    3.方法被重写后,访问调用的都是子类方法,如果想要访问父类方法,可以通过子类方法中使用parent关键字来强制访问父类方法

    4.parent不能访问父类中的属性(静态属性和常量可以)

 

以上是关于重写override的主要内容,如果未能解决你的问题,请参考以下文章

智能合约实战 solidity 语法学习 12 [ virtual 重写override 抽象abstract 接口interface 库library 销毁selfdestruct] 附代码(代码片

JAVA重写不需要@override

智能合约实战 solidity 语法学习 12 [ virtual 重写override 抽象abstract 接口interface 库library 销毁selfdestruct] 附代码

智能合约实战 solidity 语法学习 12 [ virtual 重写override 抽象abstract 接口interface 库library 销毁selfdestruct] 附代码

方法的重写override,重载overload。

c#基础-19.重写(override)和覆盖(new)的区别