簡體   English   中英

擴展接口以更改方法簽名

[英]Extending interfaces changing method signature

考慮以下接口

interface Foo1
{
    public function foo(BaseClass)
}

interface Foo2
{
    public function foo(SpecialClass)
}

其中, SpecialClass繼承自BaseClass

現在,無論何時需要Foo1實例,都可以使用Foo2實例。 我的意思是,如果我需要一個帶有接受SpecialClassfoo方法的對象,那么我可以使用帶有接受BaseClassfoo方法的對象來完成這項工作。

因此,我希望能夠將Foo1聲明為Foo2的Foo2 (即Foo1 extends Foo2 )。

PHP (我通常使用的語言)中,這是不可能的,並且會產生致命錯誤。

據我所知,這在Java中是可行的,但需要使用特定的類作為參數來實現特定的foo方法(我錯了嗎?)。

所有這些都有意義嗎? 是否有其他提供這種功能的面向對象語言?

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

        ...
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM