2013-04-04 124 views
1

我有點與Java中的匿名類輸了,我已經知道了他們,但我怎麼可以使用這個類:Java的匿名類

private abstract class CustomRectangle { 
    protected final int width; 
    protected final int height; 
    protected final int xOffset; 
    protected final int yOffset; 
    protected final int borderSize; 

    public CustomRectangle(final int width, final int height, final int xOffset, final int yOffset, final int borderSize) { 
     this.width = width; 
     this.height = height; 
     this.xOffset = xOffset; 
     this.yOffset = yOffset; 
     this.borderSize = borderSize; 
    } 

    abstract void inBorder(final int dx, final int dy); 

    abstract void outBorder(final int dx, final int dy); 

    public void draw(Graphics2D g2d) { 
     for (int x = 0; x < width; x++) { 
      for (int y = 0; y < height; y++) { 
       int dx = Math.min(x, width - 1 - x); 
       int dy = Math.min(y, height - 1 - y); 
       if (dx < borderSize || dy < borderSize) { 
        inBorder(dx, dy); 
       } 
       else { 
        outBorder(dx, dy); 
       } 
       g2d.drawLine(x + xOffset, y + yOffset, x + xOffset, y + yOffset); 
      } 
     } 
    } 
} 

在另一種方法做以下的事情在同一時間:

  1. 擴展CustomRectangle重寫InBorder()和outBorder()
  2. 通過調用draw()方法繪製新CustomRectangle。

必須有一個簡單的方法來做到這一點,我不想每次我想繪製一個CustomRectangle時都需要大量的類。

幫助表示讚賞:)

編輯解決方案,包括:

new CustomRectangle(CARD_DIMENSION.width, CARD_DIMENSION.height, 0, 0, 5) { 
     @Override 
     public void inBorder(final int dx, final int dy) { 
      g2d.setColor(new Color(red, green, blue, 255 - Math.min(dx, dy))); 
     } 

     @Override 
     public void outBorder(final int dx, final int dy) { 
      g2d.setColor(new Color(red, green, blue, 192 - Math.min(dx, dy))); 
     } 
    }.draw(g2d); 

也許它不看那個漂亮的,但它有非常方便的在我的應用程序的設計。

+0

點2的含義並不完全清楚。您需要在哪個點繪製矩形?你真的需要創造許多不同的繪製邊界的方式嗎?您是否可以不進行數據驅動?以邊界寬度作爲參數? – 2013-04-04 15:24:04

+0

這不是關於邊框寬度,而是關於我要處理爲不同矩形分配的每個像素的顏色(並且在內外邊界上也不同)的事實。當我構造這個匿名類時,我想立即繪製矩形。 – skiwi 2013-04-04 15:25:56

+0

所以你不能只是構造匿名類的實例,然後調用draw? – 2013-04-04 15:47:57

回答

7

延長CustomRectangle將是一個匿名類的語法:

CustomRectangle r = new CustomRectangle() { 
    @Override 
    public void inBorder(final int dx, final int dy) { 
     // implementation 
    } 
    @Override 
    public void outBorder(final int dx, final int dy) { 
     // implementation 
    } 
} 

避免使用這些匿名類的將是你的參數矩形類輔助對象實施inBorderoutBorder另一種方法。那麼矩形類不一定是抽象的;相反,它會將實現委託給幫助對象(可以在施工或通過setter提供)。

+0

使用你的解決方案,它工作正常:)編輯我原來的職位。 – skiwi 2013-04-04 15:32:30

+0

@skiwi - 如果這對你有效,也許你應該將其標記爲解決方案。正如[常見問題](http://stackoverflow.com/faq#howtoask)中所述,這樣做可以幫助社區中的其他人,因爲它標誌着什麼起作用。你也應該對你的問題做出答案。 – 2013-04-04 17:11:18

0

您可以通過在需要類的實例時簡單定義所需的函數來擴展此抽象類的匿名類。它看起來像這樣:

CustomRectangle rect = new CustomRectangle() { 
    @Override 
    public void inBorder(final int dx, final int dy) { 
     // Your implementation here. 
    } 
    @Override 
    public void outBorder(final int dx, final int dy) { 
     // Your implementation here. 
    } 
} 

然後,你可以簡單地調用rect.draw()或任何其他你所需要的 - 它像任何其他對象。