为什么要扩展一个类而不是仅仅向原始类添加一个新方法?

时间:2012-09-26 20:02:12

标签: php oop methods extend

当我在OOP上课时,我终于有了我的阿哈时刻。我一直在努力思考这个想法。现在我开始明白了,我想知道扩展课程的目的是什么。将另一种方法添加到课堂中是不是更简单?或者我只是忽略了这一点?

3 个答案:

答案 0 :(得分:4)

如果要为类添加功能,请添加方法。但是,有些情况下您希望添加功能,但不能在基类中执行此操作。

最好的是一个例子。向类添加方法Radius仅在类为Circle时才有意义,Rect没有半径。向基类添加方法Radius也没有意义,因为Rect类也会获得方法Radius

示例:

abstract class Shape
{
  abstract public function Draw();
}

class Rect extends Shape
{
  public function Draw()
  {
  }
}

class Circle extends Shape
{
  public function Draw()
  {
  }

  public function Radius()
  {
  }
}

答案 1 :(得分:2)

有时原始类是您无法更改的库的一部分。

有时你想以多种不同的方式扩展超类。

例如(java语法而不是PHP,但想法是一样的):

class Shape {
  abstract double getArea();
}

class Square extends Shape {
  double getArea() {
    return size * size;
  }
}

class Circle extends Shape {
  double getArea() {
    return radius * radius * Math.PI;
  }
}

对于接受Shape类型参数的方法,您可以传入Squares和Circles。该方法不需要知道它获得了哪一个,但仍然可以调用getArea()。如果您只是将方法添加到Shape类,这将无效。

答案 2 :(得分:2)

这将是一个简化,但为了给你一个真实的例子:

考虑您要创建一个内容管理系统,即根据用户输入在您的网站上显示不同页面的脚本。

您可能希望每个页面(让我们称之为模块)具有特定功能,例如在该页面/模块上执行允许的命令。然后,这些不同的命令可以是每个模块类中的不同方法。

但是,如果您允许登录命令,无论用户当前位于您的网站中,该怎么办?即,这将是所有模块之间共享的命令。

然后,您可以通过拥有一个父模块类来解决此问题,登录方法将驻留在该模块类中,并且可由所有模块执行。

// Your parent class
abstract class ParentModule 
{
   protected function login()
   {
      // Login stuff
   }
}

// One of your modules
final class ArticleModule extends ParentModule
{
    public function submit_article()
    {
        // An example function
    }
}

// Another one of your modules that the user could still login from
final class AnotherModule extends ParentModule
{
    public function another_command()
    {
        // Magic
    }
}

您的控制器可能看起来如下所示。

$module = new ArticleModule();
$module->login();
$module->submit_article();

最后,当你进入界面 - 让我永远理解那些 - 你将再次看到抽象类的好处。事实上,如果你完全掌握抽象类的概念,你将更容易理解接口。