扩展接口更改方法签名

时间:2016-05-11 08:51:49

标签: java php oop inheritance interface

考虑以下接口

interface Foo1
{
    public function foo(BaseClass)
}

interface Foo2
{
    public function foo(SpecialClass)
}

其中SpecialClass继承自BaseClass

现在,只要需要Foo1实例,就可以使用Foo2实例。我的意思是,如果我需要一个接受foo的{​​{1}}方法的对象,我可以使用一个接受SpecialClass foo方法的对象来完成工作。

因此,我希望能够将BaseClass声明为Foo1的子类(即Foo2)。

Foo1 extends Foo2(我通常使用的语言)中,这是不可能的,并且会产生致命的错误。

据我所知,这在Java中是可行的,但需要实现一个特殊的PHP方法,将一个特殊的类作为参数(我错了吗?)。

这一切都有意义还是我错过了什么?是否还有其他面向对象的语言可以提供开箱即用的功能?

1 个答案:

答案 0 :(得分:2)

在java语法中,接口应声明如下:

interface Foo2
{
    public void foo(SpecialClass b);
}

interface Foo1 extends Foo2
{
    public void foo(BaseClass s); // In Java doesn't inherits from Foo2.foo!
}

从继承角度看,上述脚本在理论上是正确的。不幸的是,Java没有以预期的方式解释它:Foo1.fooFoo2.foo被认为是两种不同的重载函数。

Java以预期方式接受和解释的唯一声明如下:

interface Foo2
{
    public void foo(BaseClass b);
}

interface Foo1 extends Foo2
{
    public void foo(BaseClass b);
}

然后你可以在自己的实现中编写类似的东西:

class Foo1Class implements Foo1
{
    public void foo(BaseClass b)
    {
        if(!(b instanceof SpecialClass)) throw new ClassCastException();

        ...
    }
}