2016-04-18 156 views
1

如果我有一個具體類Foo,並且我想添加一個名爲Bar的「別名」,它延伸Foo但不覆蓋任何方法 - Java會讓我這樣做嗎?沒有覆蓋(別名類)的子類

編輯:上下文 - 目標是最終將Foo重命名爲Bar,因爲Foo的命名很差;然而,Foo依賴於另一個項目,我無法在同一提交中同時更改FooFooCaller。爲了避免破壞FooCaller,我將做三個改變:(1)加上Bar,(2)改變FooCallerBarCaller(相同的行爲),(3)一起刪除Foo(當沒有更多的FooCaller s時)。

這裏是否有任何疑難解答,或者Bar的行爲與Foo的行爲相同?

+2

我相信你需要關注構造函數,但是沒有義務覆蓋父類的任何方法,除非父類是抽象的。 – KevinO

+2

你會使用'Foo'還是'Bar'作爲泛型類型參數,例如: '列表'? – rgettman

+0

@rgettman nope只是一個漸進重構的別名 – mfrankli

回答

1

是,Java將讓你繼承一個非final具體類只是爲了混疊原始類的目的。

public class Foo { /* implementation */ } 

public class Bar extends Foo {} 

這將是最小的實現,假設只有在Foo一個默認的構造函數。

public class Foo { 
    public Foo(String baz) { /* constructor implementation */ } 
} 

public class Bar extends Foo { 
    public Bar(String baz) { super(baz); } 
} 

所有非privateFoo方法將會被繼承下來:如果有帶參數的構造函數Foo,那麼你必須爲你打算調用來創建你Bar情況下每一個構造,如提供一個構造函數BarBar

它可能不起作用的唯一地方是如果您打算使用Bar代替Foo作爲泛型類型參數。

例如,如果您有List<Bar>替換List<Foo>,那麼你的List不再持有任何Foo情況下,或可能延長Foo任何其他類的實例。

此外,因爲Java的泛型是不變的,一個List<Bar>List<Foo>一個亞型,即使BarFoo。有關詳細情況,請參閱Is List a subclass of List? Why aren't Java's generics implicitly polymorphic?。此外,如果您使用List<? extends Foo>以便您可以使用List<Foo>List<Bar>,但您將無法addnull以外的其他任何東西。

您聲明您不會在泛型中使用它,但如果您的需求被擴展,則值得記住。

總而言之,Java編譯器會讓你這樣做,但是有限的上升空間 - 使用Bar而不是Foo作爲別名 - 並且是一個潛在的缺點,我沒有理由使用這個別名過程。

+0

此外,依賴於getClass()的代碼可能會有不同的表現。 – user140547

+0

仿製藥問題是一個很好的觀點。在我的具體情況中,目標是最終將Foo重命名爲Bar,因爲Foo的命名很差;然而,Foo依賴於另一個項目,我不能在同一提交中同時更改Foo和FooCaller。爲了避免打破FooCaller,我會做三個改變:(1)添加Bar,(2)將FooCaller更改爲BarCaller(相同的行爲),(3)完全刪除Foo。 – mfrankli

+0

@mfrankli這是包含在你的問題中的好上下文。我建議將Foo重命名爲Bar,然後創建一個新的Foo來擴展Bar以實現向後兼容。 – dsh

1

只要您使用正確的可見性,Bar的行爲將與Foo相同。 Bar中的私人方法和屬性將無法訪問,受保護的方法將被視爲Bar中的私有方法。

下面的例子將輸出「Foo」到您的控制檯。

class Example 
{ 
    public static void main (String[] args) 
    { 
     Bar b = new Bar(); 
     System.out.println(b.getName()); 
    } 
} 

class Foo { 
    protected String name; // Will be private in Bar 

    public Foo() { 
     this.name = "Foo"; 
    } 

    public String getName() { 
     return this.name; 
    } 
} 

class Bar extends Foo { 

}