当前位置:首页 > Web开发 > 正文

它能够让你的子类有自己的个性又能使用父类的能力

2024-03-31 Web开发

  在面向东西开发中,出格是使用现代化框架的过程中,我们经常会和接口、抽象类打交道。出格是我们本身测验考试去封装一些成果时,接口和抽象类往往会是我们开始的第一步,但你真的了解它们吗?

  抽象类界说

  抽象类的特点:

  顾名思义,它是抽象的,固然也就是不能被实例化的。所以,抽象类一般是作为我们的基类来进行界说的。

  在一个类中,只要有一个要领被界说为抽象的,那么这个类就必需加上abstract关键字成为抽象类。

  被界说为抽象的要领只声明其挪用方法,不能界说其具体的成果实现。

  子类必需界说父类中的所有抽象要领,这些要领的访谒控制必需和父类一致或者更为宽松。

  要领的挪用方法必需匹配,即类型和所需参数数量必需一致。子类实现的抽象要领可以增加参数但必需有默认值。

  abstractclass A {

  publicfunction show(){

  $this->getName();

  echo PHP_EOL;

  }

  protectedabstractfunction getName();

  publicabstractfunction getAge($age);

  }

  class ChildA1 extends A {

  publicfunction getName(){

  echo"I‘m ChildA1";

  }

  publicfunction getAge($age){

  echo"Age is " . $age;

  }

  }

  class ChildA2 extends A {

  protectedfunction getName(){

  echo"I‘m ChildA2";

  }

  publicfunction getAge($age, $year = ‘‘){

  echo"Age is ". $age . ‘, bron ‘ . $year;

  }

  }

  $ca1 = new ChildA1();

  $ca1->show();

  $ca1->getAge(18);

  $ca2 = new ChildA2();

  $ca2->show();

  $ca2->getAge(20, 2000);

  接口界说

  接口的特点:

  可以指定某个类必需实现哪些要领,但不需要界说这些要领的具体内容。

  就像界说一个标准的类一样,但此中界说所有的要领都是空的。

  接口中界说的所有要领都必需是公有,这是接口的特性。

  类中必需实现接口中界说的所有要领,否则会报一个致命错误。类可以实现多个接口,用逗号来分隔断绝分手多个接口的名称。

  类要实现接口,必需使用和接口中所界说的要领完全一致的方法。否则会导致致命错误

  接口也可以担任,通过使用 extends 操纵符

  接口中也可以界说常量。接口常量和类常量的使用完全不异,但是不能被子类或子接口所笼罩

  interface B1 {

  const B1_NAME = ‘Interface B1‘;

  function getName();

  function getAge($age);

  }

  interface B2 extends B1 {

  function show();

  }

  interface B3 {

  function getSchool();

  }

  class ChildB implements B2, B3{

  function getName(){

  echo"I‘m ChildB";

  }

  function getAge($age, $year = ‘‘){

  echo"Age is " . $age;

  }

  function show(){

  $this->getName();

  echo PHP_EOL;

  $this->getAge(23, 1997);

  echo PHP_EOL;

  echoself::B1_NAME;

  echo PHP_EOL;

  }

  function getSchool(){

  echo"study in Peking University";

  echo PHP_EOL;

  }

  }

  $b = new ChildB();

  $b->show();

  $b->getSchool();

  抽象类和接口的区别

  从上面我们可以总结出一些抽象类和接口的区别:

  抽象类的子类遵循担任原则,只能有一个父类;但一个类可以实现多个接口

  抽象类中可以有非抽象的已经实现的要领;接口中全是抽象的要领,都是要领界说

  抽象类中要领和变量的访谒控制本身界说;接口中只能是大众的

  那么问题来了,这两货哪个好?抱愧,这个问题可没有答案,它们的感化差别。抽象类可以作为基类,为子类供给大众要领,并定制大众的抽象让子类来实现。而接口则是更高条理的抽象,它可以让我们依赖于抽象而不是具体的实现,为软件开发带来更多的扩展性。

  面向接口开发

  接口,实际上也可以看做是一种契约。我们经常会拿电脑主机箱后面的插口来说明。好比USB接口,我们界说了它的巨细,里面的线路格局,不管你插进来的是什么,我们都可以连通。而具体的实现则是取决于电脑软件对插入的硬件的解释,好比U盘就会去读取它里面的内容,而键盘则会识别为一个外设。

  从这里可以看出,,接口能够为我们措施的扩展供给非常强大的支撑。任何面向东西语言中接口都长短常重要的特性。下面我们来用接口模拟刚刚说的USB插口。

  interface USB{

  function run();

  }

  class Keyboard implements USB{

  function run(){

  echo"这是键盘";

  }

  }

  class UDisk implements USB{

  function run(){

  echo"这是U盘";

  }

  }

  这么写有什么好处呢?我们再深入一个观点:依赖注入。如果使用面向接口开发的话:

  function testUSB (USB $u){

  $u->run();

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/30236.html