2016-10-17 103 views
0

我:我可以限制哪些類可以實現接口嗎?

  1. abstract class Vehicle
  2. abstract class Car extends Vehicleabstract class Truck extends Vehicle
  3. DodgeRam extends Truck
  4. interface Dump

現在我想限制Dump接口,使得它只能通過Truck子類實現,沒有明確表示Truck implement Dump。我怎樣才能做到這一點?

我想我可以將Dump更改爲interface Dump<T extends Truck>,然後說DodgeRam implements Dump<DodgeRam>。問題是沒有任何東西阻止我說ToyotaCamary implements Dump,只是離開類型。

UPDATE:

我這樣做的原因是因爲我想避免大量的類型檢查/鑄造的。比方說,我的TruckisOffRoad屬性:

public class Truck { 
    private boolean isOffRoad; 

    public Truck(boolean isOffRoad) { 
     this.isOffRoad = isOffRoad; 
    } 

    public boolean isOffRoad() { 
     return isOffRoad; 
    } 
} 

比方說,我也有一個Dealership它管理我的Vehicle的名單:

public class Dealership { 
    List<Truck> getTrucks() {...} 

    List<Dump>getDumpers() {...} 
} 

現在我要檢查所有的越野能力,我「泥頭車」:

for (Dump dump: dealership.getDumpers()) { 
    print dump.isOffRoad(); 
} 

我不希望有類型檢查/施放每次

for (Dump dump: dealership.getDumpers()) { 
    if (dump instanceOf Truck) { 
     print ((Truck)dump).isOffRoad(); 
    } 
} 
+3

不,沒有什麼能阻止你。 Java如何知道?你如何確信一些有割炬和焊機的聰明人不會在豐田卡梅里的後面添加翻車機?你無法知道。 – duffymo

+0

可能是你發佈了錯誤的問題。你能解釋一下你想最終達到什麼嗎? – David

+0

@大衛更新了我的問題 – tir38

回答

1

不,接口總是用來提供公共原型,我們不能限制類來實現接口。

有一兩件事你可以嘗試是..你可以在class Truck定義Dump接口,使Truck類包的範圍,而不是公衆和保持Truck的所有子類在同一個包。以便其他班級不能訪問Truck班,以便其他班級不能實施Dump界面。 - 這是沒有嘗試,但猜測它的作品。

1

接口根據定義是公共的,因此任何東西都可以實現它們。也許如果你解釋了你的真正目標是什麼,可能有其他方法來實現它

1

如果您只想要Truck來執行Dump那麼interface不是做這項工作的正確工具。

相反,你必須申報中存在的DumpTruck(無論是abstract,或者不考慮,如果實施在這個級別有意義)的方法。

例子:

如果Dumppublic interface Dump { void foo(); }

然後Truck應該public abstract class Truck { public abstract void foo(); }

不實現Dump而只有Truck子類可以實現foo()這樣。

相關問題