【问题标题】:Extending interfaces changing method signature扩展接口更改方法签名
【发布时间】:2016-09-06 13:17:11
【问题描述】:

考虑以下接口

interface Foo1
{
    public function foo(BaseClass)
}

interface Foo2
{
    public function foo(SpecialClass)
}

SpecialClass 继承自 BaseClass

现在,只要需要 Foo2 实例,就可以使用 Foo1 实例。我的意思是,如果我需要一个带有foo 方法并接受SpecialClass 的对象,我可以使用带有foo 方法并接受BaseClass 的对象来完成这项工作。

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

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

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

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

【问题讨论】:

    标签: java php oop inheritance interface


    【解决方案1】:

    在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();
    
            ...
        }
    }
    

    【讨论】:

    • 你说得对,我误会了。我很抱歉。以上错误,关于Java语言的答案还是一样的。我更正了答案
    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多