2011-03-31 91 views
5

两个接口这不起作用:无法实现具有相同的方法名

interface TestInterface 
{ 
    public function testMethod(); 
} 

interface TestInterface2 
{ 
    public function testMethod(); 
} 

class TestClass implements TestInterface, TestInterface2 
{ 

} 

给我的错误:

Fatal error: Can't inherit abstract function TestInterface2::testMethod() (previously declared abstract in TestInterface).

是正确的吗?为什么这是不允许的?对我来说没有意义。

这也会出现在抽象函数中,例如,如果您实现了一个接口,然后从具有相同名称的抽象函数的类继承。

回答

8

实现包含具有相同签名的方法的两个接口是没有意义的。

编译器无法知道这些方法是否实际上具有相同的目的 - 如果不是这样,这意味着您的类中至少有一个接口不能被实现。

例子:

interface IProgram { function execute($what); /* executes the given program */ } 
interface ISQLQuery { function execute($what); /* executes the given sql query */ } 

class PureAwesomeness implements IProgram, ISQLQuery { 
    public function execute($what) { /* execute something.. but what?! */ } 
} 

所以你看,这是不可能实现的两个接口的方法 - 这也将会是无法调用它实际上实现了从给定的接口方法的方法。

+5

但接口的全部意义在于它们没有实现。如果你想让你的类可以传递给一个为参数指定一个接口的函数,另一个接口指定另一个接口,但都有一个共同的方法?像“getName()”这样的方法名称在另一个接口上不会有不同的用途。 – Gnuffo1 2011-03-31 09:20:41

+5

在这种情况下,您应该创建一个新的界面,例如'INamed'只包含'getName()'方法。 – ThiefMaster 2011-03-31 09:24:02

+1

他们没有实现,但他们确实有语义,至少隐含。虽然你可以在一个接口中实现一个方法,在使用它的不同类中具有完全不同的含义,但这与接口的精神相反。但是,如果实现两个不同的接口,则不能保证它们的说明符知道对方的任何内容,因此名称相似的方法具有相似的语义。我想你可以让每个接口扩展一个包含常用方法的通用接口。 – 2011-03-31 09:27:53

-1

这是不允许的,因为PHP不能确定哪个接口有你想要的方法。在你的情况下,它们是相同的,但想象一下如果它们有不同的参数。

您应该重新考虑您的应用程序设计。

7

The PHP manual明确地说:

Prior to PHP 5.3.9, a class could not implement two interfaces that specified a method with the same name, since it would cause ambiguity. More recent versions of PHP allow this as long as the duplicate methods have the same signature.

+0

我不明白歧义在哪里,因为没有实现(这是接口的全部要点)。我可以明白为什么你不想用不同签名的相同方法,但是,在签名相同的情况下,这不应该留给具体实现来处理吗?例如,Java的工作方式不是这样吗? – Muc 2012-12-17 15:49:21

+1

我认为你所说的有一个论点:这是一个语言设计师需要从多大程度上保护你自己的决定。没有_intrinsic_不明确性,但是如果接口具有相同签名的函数,它们需要的函数的语义可能匹配,或者它们可能完全不同。 – 2012-12-18 15:35:58

+0

这看起来倒退了。不应该只允许他们有不同的签名?如果这两种方法具有不同的签名,则任何调用其中一种方法的人都会显式调用他们想要的特定方法。即使这两种方法有两个完全不同的目标,也没关系,因为会调用正确的方法。但是,如果这两种方法具有相同的签名,并且每种方法的目标完全不同,那么就没有办法可以有一种方法可以用于两种目的,所以单一方法就没有意义。任何人都可以提供一些计数器原理? – 2015-09-02 22:53:42

3
interface BaseInterface 
{ 
    public function testMethod(); 
} 

interface TestInterface extends BaseInterface 
{ 
} 

interface TestInterface2 extends BaseInterface 
{ 
} 

class TestClass implements TestInterface, TestInterface2 
{ 
    public function testMethod() 
    { 
    } 
} 
相关问题