几周前,我开始练习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();
}
对代码的疑问
我认为这就是...... 谢谢大家的进步,我知道解决像我这样的初学者怀疑是有点无聊。
抱歉我的英语:$
答案 0 :(得分:2)
有几件事:
BaseCatalog
定义了InterfaceCatalog
使用的所有功能。我会考虑BaseCatalog
实施InterfaceCatalog
;根据定义,它的每个子类也都是InterfaceCatalog
。OrganicCatalog
可能不应该有自己的$_count
和$_collection
,因为它们在基类中受到保护(因此可用于子类)。 抽象类可以很好地修改属性,只要在抽象类中定义属性即可。理想情况下,抽象基类应该具有您希望子类继承的功能的几乎完整的实现(即,“完成”减去您需要子类实现的内容)。必须由子类实现的东西应标记为抽象。
如果您希望所有目录都扩展BaseCatalog
,那么根本不需要接口。它的主要用途是,如果您希望有一个目录来管理所有内容(即:它具有自定义getCount
和getProducts
方法)。执行此操作的类应实现接口但不扩展基类。如果InterfaceCatalog
的实现不能总是像真实的目录那样,那么可能应该添加接口。
答案 1 :(得分:0)
到目前为止看起来很不错SergiGP。
所有目录类型都具有相同的属性,区别 他们是获取此信息的过程。
听起来不错。
接口将具有所有目录类型将实现的方法 只有方法的原型(如果我要定义一些行为我 应该使用抽象类)这是正确的吗?
是的,这是正确的。
我认为Base产品永远不会直接实例化,我 在摘要中是thinkink,但我一直在阅读摘要不能 修改属性...也许我可以将构造设置为私有?
这不正确。抽象类可以很好地修改属性。所以你肯定可以将BaseCatalog
定义为抽象。而且,正如cHao already mentioned,我的确建议您BaseCatalog
实施InterfaceCatalog
。
声明属性(集合,计数......)的正确方法是什么? 只在基地?有人可以解释一下吗?
和
将访问者(getter和setter)放在Base类中是正确的吗?
这实际上取决于您预见的基类衍生产品的要求。如果您认为所有衍生产品都需要这些属性,并且可以为它们使用一些基本方法实现(getter),这非常好。我根本没有看到任何错误。
如果您甚至不希望衍生物覆盖方法,您可以将它们声明为final
。