2017-05-03 42 views
3

設置我的代碼結構時遇到困難。在一個項目中,我有兩個類LeftCellRightCell,這兩個類都擴展了Cell。現在,爲了避免代碼重複,我想在其他多個項目中使用這些對象。問題是我也想爲這些對象添加額外的功能(特別是Cell對象),每個項目都有所不同。繼承層次結構更改以減少代碼重複

假設我創建了一個新項目,我想用void draw()方法將Cell對象可視化。我首先想到的是要建立一個新的CellProject1類,它擴展了Cell類,幷包括draw()方法:

class CellProject1 extends Cell { 
    void draw() {} 
} 

的問題是,任何LeftCell/RightCell對象創建,也當然不能訪問這個draw()方法。我想我要以某種方式擠Cell子類的類層次結構,使得它的變化:

Cell 
    LeftCell 
    RightCell 

到:這取決於我運行的項目

Cell 
    CellProjectX 
     LeftCell 
     RightCell 

。我玩過泛型,但無法實現。歡迎所有建議!

回答

0

的問題是,我創造的任何LeftCell/RightCell對象,請 當然無法獲得這場平局()方法。

特定於子類的方法當然不能在不知道它的父實例上調用。

由於您的要求是

繼承層次改變,以減少代碼的重複 在一個項目中,我有兩個類LeftCell和RightCell,既 擴展類細胞。 現在,爲了避免代碼重複,我想在 多個其他項目

我認爲你應該做的事情有點不同使用這些對象。

如果你想避免爆炸的組合可能的班,而不是複製LeftCellRightCell就像你的例子數量:

Cell 
    CellProjectX 
     LeftCell 
     RightCell 

可能由最終完成:

Cell 
    CellProjectY 
     LeftCell 
     RightCell 

Cell 
    CellProjectZ 
     LeftCell 
     RightCell 

你應該贊成繼承的構成來創建你的特定項目實現。

對於常見的細胞結構:

Cell子類可以是一個Cell接口定義任何Cell常用的方法,你可以有一個AbstractCell類,定義了它常見的實現。

public interface Cell{ 
    int getValue(); 
    void setValue(int value); 
} 


public abstract class AbstractCell implements Cell{ 
     ... 
} 

然後,你可以通過擴展AbstractCell定義RightCellLeftCell

public class RightCell extends AbstractCell { 
     ... 
} 

public class LeftCell extends AbstractCell { 
     ... 
} 

有關具體到一個項目的小區實現:

現在,在一個特定的項目,你可以一個創建通過將其與Cell實例(最後是LeftCell或)組合來實現自定義Cell實現實例),它將在特定項目具體類中用於實現接口Cell
在具體實施中,您當然可以添加任何特定於該項目的方法。
例如:

class CellProject1 implements Cell { 

    private Cell cell; 

    CellProject1 (Cell cell){ 
     this.cell = cell; 
    } 

    public int getValue(){ 
     cell.getValue(); 
    } 

    public void setValue(int value){ 
     cell.setValue(value); 
    } 

    public void draw(){ 
    ... 
    } 

} 

可以使創建CellProject1情況下,這樣的:

CellProject1 leftCell = new CellProject1(new LeftCell()); 
CellProject1 rightCell = new CellProject1(new RightCell()); 
leftCell.draw(); 
rightCell.draw(); 

而且在使用CellProject2實例與特定write()方法的另一個項目,你可以寫:

CellProject2 leftCell = new CellProject2(new LeftCell()); 
CellProject2 rightCell = new CellProject2(new RightCell()); 
leftCell.write(); 
rightCell.write(); 
0

問題是我還想爲這些對象(特別是Cell對象)添加額外的功能,這些對象每個項目都不相同。

我建議創建一個接口,Cell工具,允許它的子類來實現你想要的方式,特別是如果Cell是一個抽象類。

public interface Features { 
    ... 
} 

public abstract class Cell implements Features { 
    ... 
}