2009-05-26 15 views
0

我正在爲使用C#的大學項目編寫一個簡單的圖形編輯器。
我創建了一個層次結構,其中每種形狀(圓形,矩形,橢圓形等)都從基類Shape繼承而來,它包含形狀顏色作爲受保護的字段。
將每個圖形形狀分爲兩部分 - 幾何圖形和渲染部件是否是一個好主意?


public abstract class Shape { 
     protected Color color; 

     public Shape(Color c) { 
      color = c; 
     } 

     public Color FigureColor { 
      get { return color; } 
      protected set { color = value; } 
     } 

     public abstract void render(Bitmap canvasToDrawOn); 

     public abstract void unrender(Bitmap canvasToDrawOn); 

     public abstract void renderPrototype(Bitmap canvasToDrawOn); 
    } 

的想法是,我希望每一個類型的形狀來封裝它`幾何部分,例如:


public class TwoDPoint: TwoDShape { 
     Point2DGeometry point; 

     public TwoDPoint(Color c, Point2DGeometry p): base(c) { 
      point = new Point2DGeometry(p); 
     } 

public struct Point2DGeometry { 
     Int32 x; 
     Int32 y; 

     public Point2DGeometry(Int32 X, Int32 Y) { 
      x = X; 
      y = Y; 
     } 

     public Point2DGeometry(Point2DGeometry rhs) { 
      x = rhs.Abscissa; 
      y = rhs.Ordinate; 
     } 

     public Int32 Abscissa { 
      get { return x; } 
      private set { x = value; } 
     } 

     public Int32 Ordinate { 
      get { return y; } 
      private set { y = value; } 
     } 
    } 

Ellipse類將封裝EllipseGeometry等
它是一個在面向對象設計方面做出了很好的決定,如果是這樣,那麼創建這種幾何類型的並行層次結構可能更好一些?

回答

1

我認爲答案是肯定的,因爲它遵循由受尊敬的MVC模式規定的軌道。

另一個優點是它可以讓您選擇更換圖形庫而不必重寫所有這些基本的幾何類。使用界面使其更容易實現。

0

我會說這取決於。你打算在形狀對象之外重複使用幾何對象,還是以幾何形狀對象的形式共享幾何對象?否則,您可能會不必要地使您的班級結構複雜化。

尋找你的代碼,你可能還需要考慮以下幾點:

  1. 有某種你的私人領域和你的公共屬性之間的命名約定。當您的私有變量是x/y並且您的構造函數使用X/Y時,使用橫座標/縱座標變得沒有意義。形狀中的同上顏色和圖形顏色。

  2. 在形狀中,爲什麼要使「顏色」受到保護,「圖形顏色」也有受保護的setter?在大多數API中(你可以把你的抽象類看作是它的派生類的API),你需要最小化改變狀態時使用哪些成員的混淆。在這個特定的例子中,我很可能使「顏色」變爲私人。

  3. 請注意您的類層次結構中的「內部類」,它們不會添加任何值。例如,你有一個抽象的Shape類,並且從它的外觀來看,TwoDShape也是如此。兩者有什麼區別?你有3個維度的支持嗎?你的繼承樹看起來更像一根棍子嗎?

HTH,祝你的項目好運。