考虑以下接口
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
方法,将一个特殊的类作为参数(我错了吗?)。
这一切都有意义还是我错过了什么?是否还有其他面向对象的语言可以提供开箱即用的功能?
答案 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.foo
和Foo2.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();
...
}
}