2009-05-04 43 views
2

比方說,我有一個叫做「形狀」的抽象父類,並且有多個子類(三角形,方形,圓形......)。我想在所有子類必須實現的父「形狀」類中定義一個抽象方法,我們稱它爲「draw」。所以所有形狀子類都必須提供「draw()」方法。但是,繪製方法需要「Stencil」類型的參數,並非每個形狀子類都可以使用任何模板...是否有可能在重寫的方法中有專門的參數?

所以有一個抽象「形狀」類,多個形狀子類和多個模具。我需要在形狀類中定義的繪製方法。一個正方形可能使用Stencil1,而該圓形可能使用Stencil2。

我猜泛型會做伎倆,但我不確定。每個形狀子類都需要定義具有特定模板的繪製方法,因爲這些類也被其他類使用,並且編譯器應該強制所有程序員使用該類支持的模板調用繪製方法。我們無法定義像「public abstract void draw(Stencil s)」這樣的抽象方法,因爲程序員可以將任何模具傳遞給方形類,而方形類僅支持「Stencil1」

任何想法?

UPDATE1: 要補充一點,形狀類不關心哪個模板被使用的子類,但是由於子類在其他班級太習慣,這一點很重要的是牽引方法被定義使得只有支持的模板被編譯器接受。

+0

除了形狀類不關心,因爲當你說:「編譯器應該強制所有程序員調用與由該類支持模板抽籤方法」 – cgp 2009-05-04 15:19:26

+0

沒有,形狀類不關心;這是關心各種Shape類別的其他用途。 – user85116 2009-05-05 00:16:33

回答

7
public abstract class Shape<S extends Stencil> 
{ 
    public abstract void draw(S stencil); 
} 

public class Square extends Shape<Stencil1> 
{ 
    public void draw(Stencil1 stencil) 
    { 
    stencil.letsdo(); 
    stencil.some(); 
    stencil.drawing(); 
    } 
} 

public class Circle extends Shape<Stencil2> 
{ 
    public void draw(Stencil2 stencil) 
    { 
     stencil.some(); 
     stencil.more(); 
     stencil.drawing(); 
    } 
} 
0

如果你想這在編譯時被捕獲,下列選項浮現在腦海中:

  • 創建一組抽象的模版。特別是如果你認爲你可以將他們分組。所以如果你有多個「方形」模板,創建一個SquareStencil抽象類型並從中派生出具體的實例。您甚至可以將它們創建爲抽象Stencils類的子集。
  • 重載繪製方法。不需要它是通用的。讓編譯器通過爲作業選擇正確的方法來幫助你。
+0

如果我超載,那會讓問題變得更糟,不是嗎?我不想要多個版本的繪製;我想要一個只接受該類的正確模版的版本。 – user85116 2009-05-04 14:52:14

1

我認爲你應該重新考慮你的初始設計。

當然,你可以通過使用instanceof等來解決這個問題。但是,這會導致一個非常令人困惑的API(如果這就是你使用它的原因)。

+0

我敢肯定,設計聽起來令人困惑,從我的描述,但它不是真的那麼糟糕 – user85116 2009-05-04 14:51:16

0

定義一個abstact模板,並讓子類的構造函數決定使用哪個stencil類。

private Stencil s; 

public void draw(){ 
    privateDraw(s) 
} 

private abstract void privateDraw(Stencil s); 
相關問題