簡體   English   中英

Java為什么接口擴展接口

[英]Java why interface extends interface

我想知道在什么情況下我們從一個接口擴展一個接口? 因為,例如

interface A{
    public void method1();
}
interface B extends A{
    public void method2();
}
class C implements B{
    @Override public void method1(){}
    @Override public void method2(){}
}

是不是相當於

interface A{
    public void method1();
}
interface B{
    public void method2();     
}
class C implements A, B{
    @Override public void method1(){}
    @Override public void method2(){}
}

背后有什么重要的原因嗎?

重要原因完全取決於界面應該做什么。

如果你有一個接口 Vehicle 和一個接口 Drivable ,那么所有的車輛都是可以駕駛的。 如果沒有接口繼承,每種不同類型的汽車類都將需要

class ChevyVolt implements Vehicle, Drivable
class FordEscort implements Vehicle, Drivable
class ToyotaPrius implements Vehicle, Drivable

等等。

就像我說的所有車輛都可以駕駛,所以更容易擁有:

class ChevyVolt implements Vehicle
class FordEscort implements Vehicle
class ToyotaPrius implements Vehicle

配車如下:

interface Vehicle extends Drivable

而且不必考慮它。

是的:它就像其他任何地方的繼承。 如果 BA 的特化,那么它應該這樣寫。 第二個表示該類恰好實現了 2 個接口,它們之間沒有任何關系。

從最終結果的角度來看,您可以只使用多個接口來代替處理層次結構(就像您可以避免在類層次結構中使用繼承行為一樣)。 然而,這會使信息更加分散,並且(如果不是更多的話)顯着地混淆了軟件模型的意圖。

是的,有一個很大的不同。

在您的第一個示例中,您的新接口 B 被定義為從 A 擴展,因此向前看,任何實現 B 的類都會自動實現 A。基本上,您是在告訴編譯器“這就是成為 A 的意義,這就是它的意義意思是成為 B,哦,順便說一句,所有 B 也是 A。 這讓你可以說...

class C implements B {
    ... you implement all of the methods you need...
    ...blah...
    ...blah...
}
A myNewA = new C();

這很好用。

但是,在你的第二個例子中,你沒有聲明 B 來擴展 A,所以上面的代碼不起作用。 當您嘗試將(第二種)C 的實例分配給 A 的引用時,它會報錯,因為您沒有告訴編譯器“所有 B 都是真正的 A”。 (即BC之間沒有關系)

里面只有一個評論

interface A{
    public void method1();
}
interface B extends A{
    public void method2();
}
class C implements B{
    @Override public void method1(){}
    @Override public void method2(){}
}

如果你聲明A a = new C();

你不能調用method2(); 因為接口A對接口B中的元素一無所知,即使您實現了類C中的方法

如果你不想在不實現 A 的情況下實現 B,你可以讓 B 擴展 A。

例子:

interface LivingThing{
public void eat();
}

interface Dog extends LivingThing{
public void Bark();
}

成為活物而不是狗是可能的,但不可能成為狗而不是活物。 因此,如果它能吠叫,它也能吃東西,但事實並非總是如此。

有時,您不想允許自己是B而不是A ,而是希望允許自己是A而不一定是B 如果ACarBSportCar ,您可能只想使用Car接口來處理某些流,但有時需要更具體並明確使用SportCar 這樣,您就不能決定哪天只實施SportCar 它也迫使您實施Car 這正是 OOP 中繼承的含義。

此外,假設您想要聲明一個實現SportCar的新類成員。 你如何讓它也實現Car接口? 據我所知,沒有辦法添加由多個接口組成的類型。

public SportCar myCar;
// public SportCar,Car myCar -> invalid

這樣你就不能保證myCar會有Car的方法(比如Drive() ),它會失去從繼承中獲得的優勢。

你說的是對的,但這不僅僅是為了完成我們的工作,如果需求是這樣的呢:

1)假設有10個接口,不是同時設計的。 例如 Java 7 中的 AutoCloseable 接口。添加了一個新的自動關閉功能,直到 Java 6 才出現。

2) 如果您設計了一個接口 C,它是一個標記接口,並且您希望從給定類 B 派生的所有類都被標記,那么最好的解決方案是使用 B extends C,而不是將實現 C 放在任何地方。

還有更多的原因。 如果您查看類和層次結構的大圖,您可能會自己得到答案。

樂於幫助達拉姆

這里的主要區別在於,在您的第一個示例中,B 是 A,然后是一些。 這意味着接口 B 調用方法 1() 和方法 2(),在第二個接口中,A 和 B 是分開的(接口 B 不包含方法 1()),類 C 實現 A 和 B。在這兩種情況下,類 C 都將覆蓋方法 1 () 和方法 2()。 我希望這有幫助!

暫無
暫無

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

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