2011-12-19 103 views
-4

任何人都可以给我一个例如下面所需的OOP结构请。php oop界面或抽象类

我想要一个主类(超级类)(接口或抽象类?),其中所有从其扩展的其他类都可以从主超类的实例调用它们的函数。

例如

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

你能拼写单词吗? “giv me n”是什么意思?你在寻找类定义语法的Python教程吗? – 2011-12-19 15:43:25

+3

你明白了,那就是问题所在。鸭子可以飞,鸭子是动物 - 但这并不意味着所有的动物都可以飞。 – Cubic 2011-12-19 15:43:34

+0

你想要做的事情不可能有充分的理由。你应该考虑一个不同的策略来解决你的问题。如果我是你,我会描述实际问题,而不是询问如何实施不可行的解决方案。 – 2011-12-19 15:57:01

回答

1

简而言之,你不能。您必须实例化扩展类,并且您将获得实例化类以及父类/类中的所有函数。

是否有任何理由需要这样做?

1

这不会按照你描述它的方式工作。 PHP(或任何其他语言)都可以知道你引用了哪个派生类。如果你实例化doWork而不是mainSupoerClass,它会起作用。

我认为你在寻找工厂模式,但我不确定。 使用该模式,您可以构建一个接口(接口或抽象类),并让工厂实例化该类的任何后代。

现在你的代码不需要知道它是哪个实例,因为它可以调用在接口/抽象基类中声明的任何方法。

接口在这方面更加灵活。如果你创建一个抽象类,你将需要从该类派生所有其他类。通常这不会是一个问题,但有时你需要一个全新的实现。在这种情况下,界面更好。您可以在完全不同的类中实现接口,并仍然使用PHP的typehinting来验证传递给函数或方法的任何对象是否实现了接口。

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对象。

+0

你在“具体”与“派生”或“子类”混淆。我有类(“小工具”),具体类派生的子类不是“具体”。最终这些子类具有“具体”的子类 – umlcat 2011-12-19 16:03:49

+0

这些术语与代码示例相关。 – hakre 2011-12-19 20:32:49