2012-09-26 32 views

回答

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() 
    { 
    } 
} 
+0

我得到你要去的地方...然而,如果在扩展类中添加绘制方法而不是在形状类中绘制目的,从而使扩展类的全部理由(DRY编码)毫无意义? – TheBestJohn

+0

形状类中的绘制方法应该是抽象的,没有办法绘制一个Shape。我调整了这个例子。 – JvdBerg

+0

好了,现在看起来我已经有了更多的阅读和理解。感谢您指点我正确的方向。 – TheBestJohn

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; 
    } 
} 

到接受型形状的参数可以在正方形以及圈传递的方法。该方法不需要知道它获取哪个,但仍然可以调用getArea()。如果您只是将该方法添加到Shape类,这将不起作用。

+0

@vascowhite:你为什么编辑我的帖子?现在这是不正确的。 – user1701374

+0

,因为它没有意义的方法有一个getCircumference()方法。为什么现在不正确?它看起来很适合我。你在方法中的计算是针对区域的。而且,自从我编辑它以来,你已经有三个upvotes(它在-1)。 – vascowhite

+0

谢谢你们对我现在有意义的信息。 – TheBestJohn

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(); 

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

相关问题