簡體   English   中英

接口多重繼承的沖突方法

[英]Conflicting methods on interface multiple inheritance

我有以下接口(在Java中,但它更多的是OO問題,而不是語言特定的,我對任何語言的答案感興趣)

public interface A {
    int foo();
}

public interface B {
    char foo();
}

如果我現在要做以下課程:

public class C implements A,B{
    public int foo() {
        return 0;
    }
    public char foo() {
        return 0;
    }
}

這將無法編譯,因為方法是沖突的。 有沒有辦法讓這項工作,或具有相同含義的東西(當然不修改A或B,這將是微不足道的)?

不,返回類型不能成為使方法簽名唯一的決定因素,因為您不需要將返回的值分配給任何東西,編譯器在這種情況下不知道該怎么做。

具體例子:

...
C object = new C();
object.foo();
...

我剛才打電話給哪個foo? 說不出來。

要完成這項工作,您需要在接口方法中使用不同的方法名稱或不同的參數類型。

編輯:假設你無法控制接口A和B(庫類或類似),這是我想要在同一個類中實現它們的解決方案:

public class C {
    private objectA = new AImpl();
    private objectB = new BImpl();

    // Work with the objects here

    private class AImpl implements A {
        public int foo() {
            // ...
        }
    }

    private class BImpl implements B {
        public char foo() {
            // ...
        }
    }
}

出現此問題是因為在OOP中,認為存在多個具有相同名稱但具有不同參數而非返回類型的方法。

問題不在於界面,問題在於類。

常見的解決方案是為每個方法指定一個不同的名稱。 避免使用很有可能命名與其他接口沖突的通用名稱。

重載帶有參數。

使用中存在幾種解決該問題的方案。 我正在假設這些是獨立的接口,意圖是多個接口(在同一個對象上實現兩個不相關的接口),並且重載與它無關。

我所知道的解決方案是:1。范圍界定。 對foo()的引用可以被限定為A.foo()或B.foo()以確定哪個是必需的。 1.命名空間。 接口在為此目的構造的命名空間內繼承,並且對foo()的所有引用必須以命名空間開頭,例如A :: foo(),B :: foo()。 別名。 在繼承時顯式重命名了一個或兩個foo()方法。 調用變得像A_foo()和B_foo()。

Ada肯定有這樣的機制,我認為Pascal的一些變體也是如此。 如果它很重要,我可以找到更多的例子。

暫無
暫無

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

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