[英]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;
}
}
編輯:根據您的評論:
Foo
的var
是List<String>
類型,而B
的var
是List<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.