Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/238.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP,OOP实用示例_Php_Oop_Interface_Abstract - Fatal编程技术网

PHP,OOP实用示例

PHP,OOP实用示例,php,oop,interface,abstract,Php,Oop,Interface,Abstract,我正在学习抽象类和接口之间的区别, 但当你没有实际的例子时,理论上的解释很难理解。 我读到: 通过更新基类,所有继承类都会随更改自动更新。另一方面,接口一旦创建就无法更改。如果需要新版本的接口,则必须创建一个全新的接口。 如果有人能为我提供一个实用的例子,我将非常感谢, 祝您度过愉快的一周。接口可以更改,您只需在继承类中实现所有更改。例如,您正在制作一个SpaceShip接口,您有CoolEnemyShip、StupidEnemyShip、PlayerShip,并且您向SpaceShip添加了一

我正在学习抽象类和接口之间的区别, 但当你没有实际的例子时,理论上的解释很难理解。 我读到: 通过更新基类,所有继承类都会随更改自动更新。另一方面,接口一旦创建就无法更改。如果需要新版本的接口,则必须创建一个全新的接口。 如果有人能为我提供一个实用的例子,我将非常感谢,
祝您度过愉快的一周。

接口可以更改,您只需在继承类中实现所有更改。例如,您正在制作一个SpaceShip接口,您有CoolEnemyShip、StupidEnemyShip、PlayerShip,并且您向SpaceShip添加了一个新函数以添加新的内容,例如Boost()函数,您必须在3个实现类(CoolEnemyShip、StupidEnemyShip、PlayerShip)中实现Boost()函数


另一方面,如果SpaceShip是一个基类,并且您在其中实现了Boost()函数,那么所有继承类都可以使用Boost()函数。这就是主要的区别,您不需要一行代码来理解它,只需要类比就足够了。

接口可以更改,您只需要实现继承类中的所有更改。例如,您正在制作一个SpaceShip接口,您有CoolEnemyShip、StupidEnemyShip、PlayerShip,并且您向SpaceShip添加了一个新函数以添加新的内容,例如Boost()函数,您必须在3个实现类(CoolEnemyShip、StupidEnemyShip、PlayerShip)中实现Boost()函数


另一方面,如果SpaceShip是一个基类,并且您在其中实现了Boost()函数,那么所有继承类都可以使用Boost()函数。这是主要的区别,您不需要一行代码来理解它,只需要类比就足够了。

考虑一下这个例子。我们有一个可驱动的接口、汽车抽象和一个同时使用这两者的Pinto类

interface Drivable 
{
  public function go();
}

abstract class Automobile 
{
  public $type;

  public function getType() {
    return $this->type;
  }
}

class Pinto
    extends Automobile
    implements Drivable 
{
  public function go() {
    // code to make it go
  }
}
通过在
Automobile
中定义方法,我们可以轻松地向所有汽车添加方法。在那里添加的任何新方法都将可用于所有扩展类

然而,如果我们向可驱动接口添加一个方法,我们必须在每个实现该方法的类中寻找并实现该方法,以添加新方法,否则它将无法编译


例如,假设我们向接口添加一个
stop()
方法
Pinto
将立即引发错误,因为它没有
stop
方法

考虑这个例子。我们有一个可驱动的接口、汽车抽象和一个同时使用这两者的Pinto类

interface Drivable 
{
  public function go();
}

abstract class Automobile 
{
  public $type;

  public function getType() {
    return $this->type;
  }
}

class Pinto
    extends Automobile
    implements Drivable 
{
  public function go() {
    // code to make it go
  }
}
通过在
Automobile
中定义方法,我们可以轻松地向所有汽车添加方法。在那里添加的任何新方法都将可用于所有扩展类

然而,如果我们向可驱动接口添加一个方法,我们必须在每个实现该方法的类中寻找并实现该方法,以添加新方法,否则它将无法编译


例如,假设我们向接口添加一个
stop()
方法
Pinto
将立即引发错误,因为它没有
stop
方法

抽象基类用于创建扩展类将继承的功能

接口用于定义一组严格的函数,这些函数必须由使用此接口的类实现


有一点重叠,抽象类可以将方法标记为抽象,将实现留给继承类。

抽象基类用于创建扩展类将继承的功能

接口用于定义一组严格的函数,这些函数必须由使用此接口的类实现


抽象类可以将方法标记为抽象,将实现留给继承类,这一点有一点重叠。

这个问题已经被问过很多次了()。这个问题已经被问过很多次了()。首先谢谢,你的解释是为一个优秀的,我想这个解释真的很好,但我不理解接口和抽象类之间的区别,如果你能编写与你的解释相协调的代码,我想它会帮助我理解,再次感谢。抽象类:可以实现方法。接口:要实现什么方法首先谢谢你,你的解释非常好,我想这个解释非常好,但我不理解接口和抽象类之间的区别,如果你能编写与你的解释相协调的代码,我想这会帮助我理解,再次感谢。抽象类:可以实现方法。接口:要实现什么方法如果我通过你的解释理解的话,当我们使用抽象类时,继承我们抽象类的类会覆盖我们的无体抽象类方法,或者它会继续它们并忽略方法的名称如果我通过你的解释理解的话,当我们使用抽象类时,继承抽象类的类会覆盖我们的无体抽象类方法,或者它会继续这些方法,并忽略方法的名称非常感谢,这是非常好的解释,我现在理解了,谢谢大家,祝你们一周愉快。@mike,这太棒了。这就解决了我头脑中令人震惊的困惑。非常感谢你们,这是一个很好的解释,我现在明白了,谢谢大家,祝你们一周愉快。@mike,这太棒了。这就解决了我头脑中令人震惊的困惑。这也是一个很好的例子