3

我仍在学习如何使用类,我想知道什么时候应该使用extends关键字(扩展类)。

假设我有一个做 A 事情的类(它是一个单例)。是否可以将它扩展到另一个做 B 的事情,即使 B 类与 A 类并不真正相关,但它使用了很多它的方法?还是我应该创建一个新课程?

4

4 回答 4

5

当涉及到面向对象编程时,通常一个类执行特定任务,例如保存用户信息或输入/输出控制。

当您假设有 1 个用于控制输出的对象时,您可以在该对象中设置一个方法来控制输出类型,或者如何处理每个特定内容,但这意味着对象的唯一目的是坏了,因为它现在不仅发送内容,而且还根据内容的类型操纵内容。

我们用来克服这个问题的一种方法是将一组任务分组到一组类/对象中,例如:

abstract class Output
{
    public $content_type = 'text/plain';

    public function _send(){}
}

输出类显然会有更多的方法,但只有与输出内容相关的方法,例如标题等,而不是内容的操作,那么你会有类似的东西:

class HTMLOutput extends Output
{
     public $content_type = 'text/html';
}

以及对内容的操作:

class CSSOutput extends Output
{
    public $content_type = 'text/css';

    public _send()
    {
         if($_SERVER['APP']['Settings']['CSSCompress'] == '1')
         {
             $this->_compress_css();
         }

         parent::_send();
    }

    private function _compress_css()
    {
         $this->content = ; //Some compression lib
    }
}

这是我在创建和组织许多分组的类/对象时遵守的主要架构点。

于 2011-06-25T03:57:05.913 回答
4

在面向对象编程中,如果一个类是具有更具体用途的类的特殊类型,则通常应该扩展另一个类。

示例:Bike 类扩展汽车

不好的例子:类 Car 扩展 Bike (可能共享类似的方法,但这并没有真正意义)

于 2011-06-25T01:36:32.680 回答
2

确保创建一个新的静态成员来存储单例实例并重载该getInstance()方法。如果没有,那么即使您调用,您最终也会访问 A 实例,B::getinstance()因为这两个类只有一个静态成员。

于 2011-06-25T03:42:44.367 回答
0

例如,如果您想通过两个类访问私有变量,则应该使用扩展。如果您可以展示您的作品,我们可以告诉您应该/不应该做什么。

于 2011-06-25T01:35:55.220 回答