【问题标题】:OOP abstract classes when to implement abstract methodsOOP 抽象类何时实现抽象方法
【发布时间】:2013-05-30 20:55:40
【问题描述】:

我正在尝试学习 PHP 中的 OOP,现在我已经掌握了抽象类。

我在理解什么时候应该在抽象类中实现抽象方法以及什么时候不应该实现一些问题。

例如,有这样的代码:

<?php

abstract class concept_car {
    /**
     * Properties can not be declared as abstract natively:
     * http://stackoverflow.com/questions/7634970/php-abstract-properties
     */
    protected $weelNum  = NULL;
    protected $doorsNum = NULL;
    protected $color    = NULL;
    protected $carType  = NULL;
    // the inheritance class must define this methods
    abstract public function setWeelNum($weelNum);

    abstract public function setDoorsNum($doorsNum);

    abstract public function setCarType($carType);
}

我不知道是否可以将这 3 个方法声明为抽象,或者我应该删除抽象并实现它们,因为属性与方法在同一个类中。

在代码的实际形式中,我想我必须在这里将方法声明为抽象并在继承类中实现它们,在子类中,但我不知道这是否正确。

P.S:我是一个初学者,我正在努力了解事情的进展,我还没有接触到设计模式,所以请用概念解释我,这样我就可以知道什么是正确的方法。

【问题讨论】:

  • 其实他们只是二传手。我认为你现在应该实施它们。
  • 我建议您将类和对象类比为现实生活中的对应部分,对真实的事物提出相同的问题并尝试回答,您很可能会得到一个好的设计。还要尝试考虑设计决策将如何影响您的代码库,例如,如果您不实现这些 set*() 方法,您将不得不稍后在每个汽车类中实现它们。
  • 另外,请丢掉设计模式的刻板印象。模式源于好的代码,您只需编写 OOP 而不考虑模式(至少目前如此)。这些模式只不过是一组每个人都知道它们的行为方式的类。
  • @Paul 谢谢你的解释,我会尽力保持在正确的轨道上。

标签: php oop abstract-class


【解决方案1】:

你必须问自己的简单问题:

所有扩展这个类的类都做同样的事情吗?

对于这个例子,答案是肯定的,他们都会这样做

public function setWeelNum($weelNum) {
  $this->weelNum = $weelNum;
}

所以不要在每个类中复制/粘贴该代码,这是没有意义的。

什么时候应该声明一个抽象方法?

当该类的所有子类必须以不同的方式实现此方法时。

例如,在Animal 类中,您将有一个public abstract function move();,因为所有动物都在移动,但您不知道具体是如何移动的。

【讨论】:

  • When all the children of that class must implement this method but in different ways. 我会说这是接口的情况,而不是抽象类。
  • @crush 我完全同意你的看法。
  • 我也同意,没有人说抽象类没有实现那个接口。
  • @Starlays 简而言之:在没有共同祖先的类中使用接口。如果他们这样做,请使用抽象类(这个抽象类)
  • 当你只描述一个接口时,你应该使用一个接口......这就是为什么它被称为接口。一个抽象类应该有一些共同的成员,就像你上面的例子一样,@Starlays。
【解决方案2】:

通常,您应该在最后一个共同祖先中实现所有方法。因此,如果您希望您的子类具有相同的行为方式,请立即实现它们。如果要实现它们,但在许多方面由不同的类实现,请将它们保留为抽象的。

实际上,抽象类只是为了要求如果有人从这个公共类继承某些东西,他将提供这些方法(抽象类类似于接口)。

如果全部实现,就不需要使用抽象类了。

【讨论】:

  • 它们是该基类属性的“默认”设置器。我认为它们应该在那个类中实现。如果每个基类都以不同的方式实现它们,那么这应该是一个接口,而不是一个抽象类。
  • @crush 是的,我错过了,通过这种方式很难想象他们可以做其他事情(通知观察者?)。我认为 Oltarus 的回答更能说明问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 2012-08-06
  • 1970-01-01
  • 2015-02-28
  • 2021-09-24
  • 2022-11-20
相关资源
最近更新 更多