簡體   English   中英

隱藏子類中超類的字段

[英]Hide a field from a superclass in a subclass

假設我有3個班級:

class Foo
{    
    protected String var;
    public void doSomething()
    {
         // does something with var
    }
}

class A extends Foo
{
    public void doSomething()
    {
        // uses var slightly differently to Foo
    }
}

class B extends Foo
{
    protected int var; // hides Foo's var field
    public void doSomething()
    {
        // does something with B's var, but still in a similar fashion to Foo
    }
}

在這種情況下,我知道並希望B的var字段隱藏Foo並仍以類似的方式使用(打印其值或執行一些計算等操作)。
故意隱藏字段會使代碼難以閱讀,但這是一個例外,還是設計不佳?

編輯:
我確實希望A從Foo繼承'var',但我也希望B繼承除var之外的所有內容。

編輯2:
忘記將訪問修飾符添加到var中。

您不能以可以覆蓋方法的相同方式來“覆蓋”字段。 您將需要使用方法重寫來實現此行為。 例如:

class Foo
{    
    private String var;

    Object getVar() {
        return var;
    }
}

class B extends Foo
{
    private int var;

    @Override
    Object getVar() {
        return var;
    }
}

編輯:根據您的評論:

FoovarList<String>類型,而BvarList<Item>類型,其中Item是一個單獨的類。 如您所知,兩者都使用列表,但模板類型不同,並且兩者仍然做同樣的事情(遍歷列表並對元素做一些事情)

聽起來好像您的類應該是通用的,例如:

abstract class Foo<T> {

    List<T> list;

    // common logic
}

class A extends Foo<String> { }

class B extends Foo<Item> { }

不要從字面上理解此代碼-只是建議可能的設計。

我的首選是避免對子類中超類中的字段進行直接字段訪問,因為它減少了對超類實現的依賴。 (肯定會有一段時間使字段protected因為我確實希望從子類中顯式使用它們,但這不是規范)。

我更喜歡做的是將字段訪問封裝在getter / setter方法內部,並有意使它們受到保護或公開,以便子類可以顯式覆蓋它們。 總的來說,我經常發現直接字段訪問會導致不必要的更新,從而導致以后無法重構或修改實現。

在您的情況下,如果您正在處理別人編寫的代碼,而無權訪問基類的源代碼,那么這很有意義。 但是否則我不會這樣做,因為它對其他開發人員可能並不那么明顯,以至於您有意隱藏該領域。 如果這僅是供您自己使用(而不是其他開發人員),那么實際上,我認為這沒什么大不了的。

暫無
暫無

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

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