2012-02-08 74 views
2

STARTING問題在我的項目接口實現

我的接口的一般理解是好的,我讀過數百篇關於這個問題的例子,不同的文章,但我仍然在保持,因爲這一切閱讀仍然沒有給我一個答案,在我自己的項目中使用這個工具。

我會嘗試從我的項目中得到一個具體的例子,我可能會從使用Interfaces中受益,希望有人能夠給我一個關於如何實現它的具體答案。

我的這個項目的目的是繪製一個A4大小的圖像,並在PictureBox中進行預覽(調整大小),然後創建一個圖形用戶界面來在PictureBox中的圖像上創建和移動條形碼(帶有下面的標題文字) 。

現在我想能夠繪製具有相同功能的另一個文本對象來移動它並顯示在預覽中。但是這將是一個正常的文本,因此它會有不同的字體和標題。 這可以很容易地完成繪圖時的集合和循環。

但是如果我想向這個圖像添加更多的對象,如果我使用接口,維護和擴展會不會更容易? 我也想通過學習如何使用一些更復雜的東西來詳細說明我的編程。

當前進場至溶液

我的主要接口

public interface IElementCreator 
{ 
    int posX { get; set; } 
    int posY { get; set; } 
    StringFormat format { get; set; } 
    string value { get; set; } 
    Font font { get; set; } 
    bool caption { get; set; } 
    Font captionFont { get; set; } 
} 

我的用於創建元件

public class ElementBase : IElementCreator, IImageUpdater 
{ 
    #region IElementCreator Variables 

    private int _posX; 
    private int _posY; 
    private StringFormat _format; 
    private string _value; 
    private Font _font; 
    private bool _caption; 
    private Font _captionFont; 

    #endregion 

    #region IElementCreator Members 

    public int posX 
    { 
     get { return _posX; } 
     set { _posX = value; } 
    } 

    public int posY 
    { 
     get { return _posY; } 
     set { _posY = value; } 
    } 

    public StringFormat format 
    { 
     get { return _format; } 
     set { _format = value; } 
    } 

    public string value 
    { 
     get { return _value; } 
     set { _value = value; } 
    } 

    public Font font 
    { 
     get { return _font; } 
     set { _font = value; } 
    } 

    public bool caption 
    { 
     get { return _caption; } 
     set { _caption = value; } 
    } 

    public Font captionFont 
    { 
     get { return _captionFont; } 
     set { _captionFont = value; } 
    } 

    #endregion 

    #region Constructor 

    public ElementBase(int posX, int posY, StringFormat format, string value, Font font, bool caption, Font captionFont) 
    { 
     this.posX = posX; 
     this.posY = posY; 
     this.format = format; 
     this.value = value; 
     this.font = font; 
     this.caption = caption; 
     this.captionFont = captionFont; 
    } 

    #endregion 

    public Image updatePreview(IElementCreator element, Image img) 
    { 
    } 
} 

接口來更新預覽圖像

public interface IImageUpdater 
{ 
    Image updatePreview(IElementCreator element, Image img); 
} 
主類

我還沒有能夠測試這個,我已經做了代碼,我會在稍後開始測試。

我想要實現的是有一個接口來處理基本文本元素的創建。有了這個,應該可以用新類來處理具有不同設置的文本元素。

這只是一個起點,我知道一些代碼缺少一切可以使用的東西,但我只是想分享並確保我不完全跟蹤。

回答

1

如果有一類是負責創建圖像

public class ImageCreator : IImageCreator 
{ 
    public Image CreatePreviewImg(string value, int fontSize, int x, int y) 
    { 
     //Your code goes here... 
    } 
} 

那麼每當你想生成您可以創建圖像製作者

IImageCreator imageCreator = new ImageCreator; 
var preview = imageCreator.CreatePreviewImg(...); 

感謝的一個實例的圖像,你可以做什麼這種方法可以讓多個圖像創建者實現IImageCreator界面,並且您的經理將決定使用哪一個。

希望給你一個想法如何在你的項目中使用接口。

UPDATE * 最新的更新爲09/02/2012 *

這裏怎麼界面看起來應該像

public interface IImageCreator 
{ 
    public Image CreatePreviewImg(string value, int fontSize, int x, int y); 
} 

只要你實現接口類,你將不得不爲該方法編寫代碼。所以您的類看起來像:

這是你的形象的項目 - 一個對象,你會傳遞給圖像製作者(這個對象包含你需要生成一個圖像的所有值),它的下面

public class ImageSettings : IImageSettings 
    { 
     public int posX { get; set; } 
     public int posY { get; set; } 
     public StringFormat format { get; set; } 
     public string value { get; set; } 
     public Font font { get; set; } 
     public bool caption { get; set; } 
     public Font captionFont { get; set; } 
    } 

    public interface IImageSettings 
    { 
     int posX { get; set; } 
     int posY { get; set; } 
     StringFormat format { get; set; } 
     string value { get; set; } 
     Font font { get; set; } 
     bool caption { get; set; } 
     Font captionFont { get; set; } 
    } 


    public class ImageCreator : IImageCreator 
    { 

接口THIS IS新方法,它接受的界面的類型,而不是作者PARAMS

 public Image CreatePreviewImg(IImageSettings imageSettings) 
     { 
      //ALL THE MAGIC HAPPENS HERE 
     } 

這是舊方法 - 不再需要 public Image CreatePreviewImg(string value,int fontSize,int x,int y) {Iniziate barcode font
PrivateFontCollection private_fonts = new PrivateFontCollection(); private_fonts.AddFontFile(「FREE3OF9.TTF」);

  //Image size A4 at 300dpi  
      Bitmap bm = new Bitmap(width, height); 
      bm.SetResolution(300, 300); 

      // Create rectangle for the canvas  
      RectangleF rectBg = new RectangleF(0, 0, width, height); 

      // Load fonts  
      Font bcFont = new Font(private_fonts.Families[0], fontSize, FontStyle.Regular, GraphicsUnit.Point); 
      Font valueFont = new Font("Tahoma", 12, FontStyle.Regular, GraphicsUnit.Point); 

      // Set StringFormat for the text value  
      StringFormat sfValue = new StringFormat(); 
      sfValue.LineAlignment = StringAlignment.Far; 
      sfValue.Alignment = StringAlignment.Center; 

      // Set StringFormat for the barcode string  
      StringFormat sfBarcode = StringFormat.GenericTypographic; 
      sfBarcode.FormatFlags = StringFormatFlags.NoClip; 

      using (Graphics g = Graphics.FromImage(bm)) 
      { 
       // Create rectangle to place the barcode and text  
       SizeF bcStringSize = g.MeasureString("*" + value + "*", bcFont); 
       SizeF valueSize = g.MeasureString(value, valueFont); 
       RectangleF recText = new RectangleF(x, y, (float)MeasureDisplayStringWidth(g, "*" + value + "*", bcFont), (float)(bcStringSize.Height + valueSize.Height)); 

       // Drawing the barcode and text  
       g.SmoothingMode = SmoothingMode.AntiAlias; 
       g.TextRenderingHint = TextRenderingHint.AntiAlias; 
       g.FillRectangle(new SolidBrush(Color.White), rectBg); 
       g.DrawString("*" + value + "*", bcFont, new SolidBrush(Color.Black), recText, sfBarcode); 

       g.DrawString(value, valueFont, new SolidBrush(Color.Black), recText, sfValue); 
      } 

      return bm; 
     } 
    } 
+0

是的,我看到你的想法。但是我的想法仍然只有一個圖像要在預覽中顯示,然後創建所有這些不同的對象,使用不同的設置,並在圖像上將它們一起繪製在最後。我現在非常困惑,我不知道我是否完全偏離了這裏:-) – 2012-02-08 14:41:53

+0

這並不意味着有多少圖像,而是關於實現的全部內容。如果你想要實現更多的圖像創作者,那麼界面將是最好的選擇。否則,你可能不需要它。另一方面,如果你打算進行單元測試,那麼界面將非常有用(甚至會說需要) – 2012-02-08 14:45:37

+0

嗯,它首先意味着一種測試工具。我需要能夠移動頁面上的所有對象和一個按鈕,以使用所有對象的新設置來更新預覽圖像。如果這就是你的單元測試的意思。我的界面問題是我理解你的文章和你的代碼,但我想我需要一個具體的例子來說明界面應該是什麼樣子以及如何實現不同的類。但是,當然,你會得到一個up :) – 2012-02-08 15:00:02

0

但是如果我想向這個圖像添加更多的對象,如果我使用接口,更容易維護和擴展嗎?我也想 喜歡詳細說明我的編程,通過學習如何使用一些更復雜的東西 。

這完全取決於你是否有多個實現接口的類。

我在你的代碼中看不到任何東西會警告接口。你有沒有考慮過讀一本關於如何用C#編程的書?閱讀的例子是學習如何編程的一種可怕的方式,你需要了解正確的編程方式,而且經常只有來自具有數十年經驗的行業人士編寫的書籍的時間。

+0

我現在看到,它可能很難明白我要去哪裏。該代碼片段只是在圖像上創建條形碼對象的初始方法。但是這可以很容易地擴展到多個類。所有不同的繪製對象都是創建A4頁面的一部分,但它們都有不同的設置。而對於你的另一點,例子並不是我讀過的所有東西,但我還在學習:) – 2012-02-08 14:24:44