2013-04-19 77 views
0

我想編寫一個需要線和圓弧類功能的折線類。我知道折線線條和圓弧,因此我應該使用接口而不是擴展(我知道你不能擴展兩個類)。問題是,我將需要編寫代碼行和圓弧類以及我想避免重複在折線類中的代碼如果可能的話。如何在編寫接口時避免重複代碼?

有沒有辦法做到這一點?

這是線類的一段代碼。 polyline類還需要具有getMidPoint(),containsPoint(x,y)等。我還沒有爲圓弧編寫代碼,但它具有類似的功能getMidPoint(),containsPoint(x,y)。

public Line (double x1,double y1, double x2,double y2){ 
    super (x1,y1,x2,y2); 
} 
public ACSPoint getMidPoint(){ 
    ACSPoint p = new ACSPoint(); 
    p.x((this.start.x()+this.end.x())/2); 
    p.y((this.start.y()+this.end.y())/2); 
    return p; 
} 
@Override 
public boolean containsPoint(double x, double y){ 
    boolean containsPoint = super.containsPoint(x, y); 
    if (containsPoint){ 
     if (x<this.start.x()||x>this.end.x()){ 
      return false; 
     } 
    } 
    return containsPoint; 
} 
@Override 
public boolean containsPoint(ACSPoint p){ 
    return this.containsPoint(p.x(), p.y()); 
} 
+0

你能提供你想要的代碼草圖嗎? – noahlz

+0

接口在編譯時執行契約(所以實現接口的類將實現該接口)。我從單純的描述中不完全理解你的問題;你能否提供你的課程模型? – Makoto

回答

4

由於Java不支持從多個類繼承,因此可以使用Object Composition

然後,PolyLine類將

  • 實現直線和圓弧接口
  • 組成直線和圓弧的實現。
  • 將對線和弧接口中方法的調用委託給相應的對象。

這樣做的缺點是您的PolyLine綁定到一個Line或Arc接口的實現。您可以通過允許在施工期間進行設置來防止這種情況發生。在典型的DI環境中,實現將被注入或定位而不是硬連線它們。

  • 線:接口和實現:

    // Interface: Line.java 
    public interface Line 
    { 
        void lineMethod(); 
    } 
    
    // Implementation: DefaultLine.java 
    public class DefaultLine implements Line 
    { 
        public void lineMethod() 
        { 
    
        } 
    } 
    
  • 弧:接口和實現

    // Interface: Arc.java 
    public interface Arc 
    { 
        void arcMethod(); 
    } 
    
    // Implementation: DefaultArc.java 
    public class DefaultArc implements Arc 
    { 
        public void arcMethod() 
        { 
    
        } 
    } 
    
  • 折線:接口和實現方式,其中直線和圓弧的實現硬連接:

    public interface PolyLine extends Line, Arc 
    { 
    
    } 
    
    public class DefaultPolyLine implements PolyLine 
    { 
        private Line line; 
        private Arc arc; 
    
        public DefaultPolyLine() 
        { 
         line = new DefaultLine(); 
         arc = new DefaultArc(); 
        } 
    
        public void lineMethod() 
        { 
         line.lineMethod(); 
        } 
    
        public void arcMethod() 
        { 
         arc.arcMethod(); 
        } 
    } 
    
  • 在直線和圓弧實現是施工過程中設置折線執行:

    public class DefaultPolyLine implements PolyLine 
    { 
        private Line line; 
        private Arc arc; 
    
        public DefaultPolyLine(Line line, Arc arc) 
        { 
         this.line = line; 
         this.arc = arc; 
        } 
    
        public void lineMethod() 
        { 
         line.lineMethod(); 
        } 
    
        public void arcMethod() 
        { 
         arc.arcMethod(); 
        } 
    } 
    

最後落實PolyLine允許客戶設置任何線的應用,而不是始終使用DefaultLine實現的,同樣適用對於弧也是如此。

+0

我接受了你的答案,但是你能否解釋一下你在「施工期間設置」的含義。謝謝 – Adil

+1

有趣的是,如果你等到Java 8發佈,它支持接口中的實現方法,這是一種多重繼承;) –

+0

@Adil,請找到更新後的答案。 – Vikdor