当我在OOP上课时,我终于有了我的阿哈时刻。我一直在努力思考这个想法。现在我开始明白了,我想知道扩展课程的目的是什么。将另一种方法添加到课堂中是不是更简单?或者我只是忽略了这一点?
答案 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();
最后,当你进入界面 - 让我永远理解那些 - 你将再次看到抽象类的好处。事实上,如果你完全掌握抽象类的概念,你将更容易理解接口。