考虑以下接口(interface)
interface Foo1
{
public function foo(BaseClass)
}
和
interface Foo2
{
public function foo(SpecialClass)
}
其中SpecialClass
继承自BaseClass
。
现在,只要需要 Foo2
实例,就可以使用 Foo1
实例。我的意思是,如果我需要一个具有接受 SpecialClass
的 foo
方法的对象,我可以使用具有 foo
方法的对象来完成这项工作接受BaseClass
。
因此,我希望能够将 Foo1
声明为 Foo2
的子类(即 Foo1 扩展 Foo2
)。
在 PHP
(我通常使用的语言)中这是不可能的,并且会产生 fatal error 。
据我所知,这在 Java 中是可行的,但需要实现一个特定的 foo
方法,以特殊的类作为参数(我在这一点上错了吗?)。
这一切有意义还是我错过了什么?有没有其他面向对象的语言可以提供开箱即用的功能?
最佳答案
在java语法中,接口(interface)应声明如下:
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();
...
}
}
关于java - 扩展接口(interface)更改方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37157534/