[英]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
而且不必考慮它。
是的:它就像其他任何地方的繼承。 如果 B是A 的特化,那么它應該這樣寫。 第二個表示該類恰好實現了 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”。 (即B
和C
之間沒有關系)
里面只有一個評論
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
如果A
是Car
而B
是SportCar
,您可能只想使用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.