请有人给我一个以下所需OOP结构的例子。
我想要一个主类(超类)(接口或抽象类?),其中从其扩展的所有其他类可以从主超类的实例调用它们的函数。
e.g。
class mainSupoerClass() {
}
class doWork exends mainSupoerClass(){
public function addEntity(){
//do stuff for entity
}
}
我希望能够做到这一点:
$data = new mainSupoerClass;
$data->addEntity(); (doesnt belong to this class but its fetching the function from doWork class)
任何人都可以开始使用正确的OOP结构来开展这项工作吗?
答案 0 :(得分:1)
这不会像你描述的那样起作用。 PHP(也没有任何其他语言)可以知道您引用的派生类。如果您实例化doWork
而不是mainSupoerClass
,则会有效。
我认为您正在寻找工厂模式,但我不确定。 使用该模式,您可以构建一个接口(接口或抽象类),并让工厂实例化该类的任何后代。
现在你的代码不需要知道它是哪个实例,因为它可以调用在接口/抽象基类中声明的任何方法。
在这方面,界面更灵活。如果创建抽象类,则需要从该类派生所有其他类。通常这不会是一个问题,但有时您需要一个全新的实现。在这种情况下,界面更好。您可以在完全不同的类中实现接口,并且仍然使用PHP的类型提示来验证传递给函数或方法的任何对象是否实现了接口。
答案 1 :(得分:1)
简单来说,你不能。您必须实例化扩展类,并且您将获得实例化类中的所有函数以及父类/类。
你有什么理由需要这样做吗?
答案 2 :(得分:0)
即使它被称为超类,也不意味着它具有在其他地方定义的所有类。方法如下:
[super] --> [concrete]
而不是
[concrete] --> [super]
因此,具体类扩展了超类。具体类将具有超类的所有内容以及具体类具有/覆盖的内容 - 但不是相反的方式。
class Super
{
public function a() {}
}
class Concrete extends Super
{
public function b() {}
}
Super
有::a()
,此外Concrete
有::b()
。但Super
永远不会有::b()
。
此外,即使您有多个类,也总是有一个实例,无论它是多少个类,通常称为对象:
$object = new Concrete;
这会产生一个Concrete
对象。
答案 3 :(得分:0)
你必须阅读。试试这些:
Article: http://sourcemaking.com/design_patterns/abstract_factory
Code: http://sourcemaking.com/design_patterns/abstract_factory/php/2
工厂设计模式似乎正是您所寻找的。 p>
我不明白你为什么要这样做:
(doesnt belong to this class but its fetching the function from doWork class)
背后的原因是什么?