java - 扩展接口(interface)更改方法签名

标签 java php oop inheritance interface

考虑以下接口(interface)

interface Foo1
{
    public function foo(BaseClass)
}

interface Foo2
{
    public function foo(SpecialClass)
}

其中SpecialClass继承自BaseClass

现在,只要需要 Foo2 实例,就可以使用 Foo1 实例。我的意思是,如果我需要一个具有接受 SpecialClassfoo 方法的对象,我可以使用具有 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.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();

        ...
    }
}

关于java - 扩展接口(interface)更改方法签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37157534/

相关文章:

javascript - 替换 wicket 的 ajax js 文件后,Wicket 6.19 导入顺序发生变化

java - 如何使使用 IKVM com 创建的 .dll 可见?

PHP cron 作业未通过 file_put_contents() 运行日志

用于批量插入查询的php绑定(bind)动态变量数

oop - 设计用户访问/权限类

javascript - 封装在 Javascript 中

java - 如何将 HTTP 发布到 CGI 脚本

java - 我想遍历页面的链接,但我的程序在中间终止而没有抛出任何错误

php - 使用 PHP/MySQL 创建 JSON 数据的正确方法

c# - 创建对象泛型类