2010-05-27 92 views
18

Java中的脆弱基類問題是什麼?什麼是脆弱的基類問題?

+3

抵制衝動主要參考書的大獎!或NIN專輯... – scunliffe 2010-05-27 13:15:50

+3

對不起,打破它給你@scunliffe,但你失敗;-) – 2010-05-27 13:19:42

+0

如果有人說FBC問題是基礎類與不明確(或不完全)指定的合同,以便改變類將可能打破依賴它的衍生出來的東西,這足夠嗎? 我們可以有派生接口,順便說一句? – mlvljr 2010-05-27 14:41:57

回答

18

脆弱的基類是繼承的常見問題,它適用於Java和任何其他支持繼承的語言。

簡而言之,基類是您繼承的類,它通常被稱爲fragile,因爲對此類的更改可能會在從其繼承的類中產生意外的結果。

減少這種方法的方法很少;但沒有直接的方法來完全避免它,而仍然使用繼承。通過在Java中將類聲明標記爲final,可以防止其他類從類繼承。

避免這些問題最糟糕的最佳做法是將所有類標記爲最終的,除非您特別打算從它們繼承。對於那些打算繼承,設計它們就好像你正在設計一個API:隱藏所有的實現細節;嚴格要求你排出什麼,並小心你接受什麼,並詳細記錄班級的預期行爲。

11

當對其進行更改會破壞派生類時,基類稱爲脆弱類。

class Base{ 
    protected int x; 
    protected void m(){ 
     x++; 
    } 

    protected void n(){ 
     x++;  // <- defect 
     m(); 
    } 
} 


class Sub extends Base{ 
     protected void m(){ 
      n(); 
     } 
    } 
+0

對父類進行簡單更改會破壞子類時,它很脆弱。如果你改變了父母的一切,並導致孩子破裂,那並不一定意味着父母是脆弱的;如果你改變一些看起來很溫和的東西並且崩潰,那就很脆弱了。 – 2010-05-27 14:13:23

+3

但是,哪些變化很簡單,即什麼是標準? – mlvljr 2010-05-27 14:32:30

0

所有什麼「科林·皮卡德」已經說的是真的,在這裏我要添加到列表,當你正在編寫的代碼,可能會導致這種在Java語言問題的最佳做法得到保護.. 。

  1. 讓所有的類爲final,因爲你不希望他們被繼承
  2. 做,如果你不能,你必須使用繼承(例如抽象類),然後讓所有的實現方法最終是沒有被其子類修改(甚至被保護的方法通常都是一個壞主意,子類不應該知道這麼多關於它的子類)...
  3. 儘量不要使用relationShip [是],而是嘗試使用[使用]關係堆之間的類圖使用接口,以避免擴展問題..
  4. 每個擴展可以是通過工具替代,如果你必須做出一個默認的實現這裏有一個代碼尖晶石:

public interface MyBehavior { 
 
    void doAction(); 
 

 
    static class Implementation implements MyBehavior { 
 
     public void doAction() { 
 
      //do some stuff 
 
     } 
 
    } 
 
} 
 

 
// instead of doing extends To a class that have the doAction method 
 
// we will make a [use a] relationShip between the Example class & the Implementation class 
 
public class Example { 
 
    private MyBehavior.Implementation helper = new MyBehavior.Implementation(); 
 

 
    public void doAction() { 
 
     this.helper.doAction(); 
 
    } 
 
}