2013-07-26 122 views
1

我有一個實例變量象下面這樣父bean:OO設計問題涉及到子類

public Class ParentBean { 
    protected boolean show; // this variable will be used to show some UI component 

    public void action() {     
     // update show variable here 
    } 

    public boolean isShow() {  
     return show; 
    }  
} 

這是一個好的設計,如果我想重新使用一個子b​​ean的「秀」變量(來顯示特定於子bean其他UI組件),如下所示:

public Class ChildBean extends ParentBean { 
    // override the action method from parent bean 
    public void action() {      
     // update show variable here 
     show = true /false; 
    }   
} 

在效果上,顯示變量正在由「childBean」更新通過改寫動作()方法。 這是一個很好的設計實踐嗎?否則,必須在ChildBean中重複相同的事情才能完成此項工作。

+0

我這這絕對沒問題。如果基類允許,派生的實現可以修改基類對象的狀態。 – PermanentGuest

+1

@Atul請記住標記你的問題爲答案(或者如果你不認爲這是一個好的答案,只是討論它)。這是對最佳答案作者的獎勵。我提到,因爲我[一旦回答](http://stackoverflow.com/q/14788100/1199132)你沒有答覆。 –

+0

@Xtreme Biker:是的,我真的很抱歉,這不應該發生,但我還沒有看到答案,一定會對此發表評論。 – Atul

回答

1

如果使用show變量爲了同樣的目的在子類中,你似乎在這個例子中是這樣做,那麼顯然你應該重用它,因爲否則你最終會寫兩次相同的代碼,這與OOP的觀點相反。

一般來說,在OOP中,只要你知道你正在修改的變量用於(你不需要),就可以重寫子類中的超類方法以及修改超類實例變量想要隨機更改不完全瞭解的類中的實例變量,或者無法訪問源代碼,因爲您不需要任何不幸的副作用),所以當它是您自己的代碼時,這是絕對的精細。

作爲一般指導原則,如果您的選擇是複製和粘貼大量代碼並且不改變地使用它,或者使用子類和超類的實例變量或函數,那麼最好是子類。否則,你錯過了OOP的觀點。

0

它是。擁有protected變量意味着您可以將其修改爲父級或子級(請記住每個單個實例的每個級別都有它自己的屬性值)。所以,如果你有一些通用的功能,這是寶貴的所有的孩子:

父類:

public void action(){ 
    //update show variable here 
    show = true; 
} 

從Appart酒店,如果你想在一個特異性目的的孩子添加一些額外的功能:

子類:

@Override 
public void action(){ 
    super.action(); 
    //Extra functionality goes here 
    //You can also access parent's 'protected' fields 
    if (show){ 
     System.out.println("Shown"); 
    } 
} 

使用的例子:

Parent p = new Parent(); 
p.action();//Prints nothing 

Child c = new Child(); 
p.action();//Prints 'shown' 
0

改變在子類中的值將不會影響超可變

這是細相對於所述的設計。當一個子類對象被實例化時,它將有一個不同的變量副本。如果超類對象被實例化,它將具有不同的副本。