PHP面向对象:抽象,接口,继承等

时间:2011-10-04 22:01:25

标签: php oop

几周前,我开始练习OO PHP,但是我做了一些课程,但我不知道我是否正确理解了这些概念。因此,我想展示一些课程,如果有人可以告诉我他们对此的看法并且可以教我一些东西,我会很高兴。

如果你能解释你的评估和修改背后的原因,我将不胜感激,并记住......我正在学习:$

我有一个产品目录,我们可以有多种类型的目录。基本上,Catalog是Product类的实例的集合......

我已经为目录实现了一个Base类,如下所示:

class BaseCatalog
{
    protected $_collection;
    protected $_count;

    public function __construct()
    {
        // some stuff here
    }

    public function getCount()
    {
        return $this->_count;
    }

    public function getProducts()
    {
        return $this->_collection;
    }
}

以后当我使用目录时,我会扩展这个类

class OrganicCatalog extends BaseCatalog implements InterfaceCatalog 
{ 
    protected $_collection;
    protected $_count;

    public function __construct() 
    {
        parent::__construct();
        // some more things here depending catalog type 
    }

    // some more methods specific of this catalog type

最后一个界面:

interface InterfaceCatalog  
{
    public function getCount();
    public function getProducts();
}

对代码的疑问

  • 所有目录类型都具有相同的属性,它们之间的区别是获取此信息的过程。
  • 接口将有所有目录类型将实现的方法,但只有方法的原型(如果我要定义一些行为,我应该使用抽象类)是否正确?
  • 我认为Base产品永远不会直接实例化,我在思考Abstract,但我一直在阅读摘要不能修改属性......也许我可以将构造设置为私有?
  • 声明属性(集合,计数......)的正确方法是什么?只在基地?有人可以解释一下吗?
  • 将访问者(getter和setter)放在Base类中是正确的吗?

我认为这就是...... 谢谢大家的进步,我知道解决像我这样的初学者怀疑是有点无聊。

抱歉我的英语:$

2 个答案:

答案 0 :(得分:2)

有几件事:

  • BaseCatalog定义了InterfaceCatalog使用的所有功能。我会考虑BaseCatalog实施InterfaceCatalog;根据定义,它的每个子类也都是InterfaceCatalog
  • OrganicCatalog可能不应该有自己的$_count$_collection,因为它们在基类中受到保护(因此可用于子类)。

抽象类可以很好地修改属性,只要在抽象类中定义属性即可。理想情况下,抽象基类应该具有您希望子类继承的功能的几乎完整的实现(即,“完成”减去您需要子类实现的内容)。必须由子类实现的东西应标记为抽象。

如果您希望所有目录都扩展BaseCatalog,那么根本不需要接口。它的主要用途是,如果您希望有一个目录来管理所有内容(即:它具有自定义getCountgetProducts方法)。执行此操作的类应实现接口但不扩展基类。如果InterfaceCatalog的实现不能总是像真实的目录那样,那么可能应该添加接口。

答案 1 :(得分:0)

到目前为止看起来很不错SergiGP。

  

所有目录类型都具有相同的属性,区别   他们是获取此信息的过程。

听起来不错。

  

接口将具有所有目录类型将实现的方法   只有方法的原型(如果我要定义一些行为我   应该使用抽象类)这是正确的吗?

是的,这是正确的。

  

我认为Base产品永远不会直接实例化,我   在摘要中是thinkink,但我一直在阅读摘要不能   修改属性...也许我可以将构造设置为私有?

这不正确。抽象类可以很好地修改属性。所以你肯定可以BaseCatalog定义为抽象。而且,正如cHao already mentioned,我的确建议您BaseCatalog实施InterfaceCatalog

  

声明属性(集合,计数......)的正确方法是什么?   只在基地?有人可以解释一下吗?

  

将访问者(getter和setter)放在Base类中是正确的吗?

这实际上取决于您预见的基类衍生产品的要求。如果您认为所有衍生产品都需要这些属性,并且可以为它们使用一些基本方法实现(getter),这非常好。我根本没有看到任何错误。

如果您甚至不希望衍生物覆盖方法,您可以将它们声明为final