我还在学习如何使用类,我想知道何时应该使用extends
关键字(扩展一个类)。
假设我有一个做A事的类(它是一个单例)。可以将它扩展到另一个执行事物B的事情,即使B类与A类没有真正关系,但是它使用了很多方法吗?或者我应该创建一个新类?
答案 0 :(得分:5)
对于面向对象的编程,通常一个类执行特定的任务,例如保持用户信息或输入/输出控制。
如果让我们说一个用于控制输出的对象,可以在该对象中设置一个方法来控制输出类型,或者如何处理每个特定内容,但这意味着对象唯一目的已被打破,因为它现在不只是发送内容,而且还根据其类型操纵内容。
我们使用的方法是将一组任务分组到一组类/对象中,例如:
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
}
}
这是我在创建和组织许多分组的类/对象时遵循的主要架构要点。
答案 1 :(得分:4)
在面向对象的编程中,如果一个类是具有更多特定用途的特殊类型,那么它应该扩展另一个类。
示例:class Bike extends Automobile
错误示例:class Car extends Bike(可能会分享类似的方法,但这没有用)
答案 2 :(得分:2)
确保为存储单例实例创建新的静态成员并重载getInstance()
方法。如果没有,那么即使你调用B::getinstance()
,你也会最终访问一个实例,因为这两个类只有一个静态成员。
答案 3 :(得分:0)
例如,如果要通过两个类访问私有变量,则应使用扩展。 如果你能展示你的作品,我们可以告诉你应该/不应该做什么。