gpt4 book ai didi

c# - 我的项目中的接口(interface)实现

转载 作者:太空宇宙 更新时间:2023-11-03 14:06:24 25 4
gpt4 key购买 nike

开始提问

我对接口(interface)的一般理解很好,我已经阅读了数百个关于这个主题的例子和不同的文章,但我仍然处于搁置状态,因为所有这些阅读仍然没有给我一个在哪里使用它的答案我自己项目中的工具。

我将尝试从我的项目中提供一个具体示例,说明我可能从使用接口(interface)中获益的地方,希望有人可以就我应该如何实现它给出一个具体的答案。

我在这个项目中的目的是绘制一个 A4 尺寸的图像并在 PictureBox 中预览(调整大小),然后使用 GUI 在 PictureBox 中的该图像上创建和移动条形码(下方带有标题文本)。

现在我希望能够绘制另一个具有相同功能的文本对象来移动它并在预览中显示。但这将是一个普通文本,因此它会有不同的字体并且没有标题。这可以在绘制时使用集合和循环轻松完成。

但是,如果我想向该图像添加更多对象,如果我使用接口(interface),维护和扩展不是会容易得多吗?我还想通过学习如何使用更复杂的东西来完善我的编程。

当前的解决方案

我的主界面

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)
{
}
}

更新预览图片的接口(interface)

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

我还没来得及测试这个,我已经编写了代码,稍后我会开始测试。

我想要实现的是拥有一个界面来处理基本文本元素的创建。有了这个,应该可以扩展新类来处理具有不同设置的文本元素。

这只是一个起点,我知道缺少一些代码才能使一切都有意义,但我只是想分享并确保我没有完全偏离正轨。

最佳答案

如果有一个负责创建图像的类,你可以做什么

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 接口(interface),您的经理将决定使用哪一个。

希望能让您了解如何在您的项目中使用界面。

更新*截至 2012 年 9 月 2 日的最新更新*

界面应该是这样的

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

一旦实现类的接口(interface),就必须为该方法编写代码。所以你的类(class)看起来像:

这是您的图像项 - 您将传递给图像创建者的对象(此对象包含生成图像所需的所有值)及其下面的接口(interface)

    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
{

这是一种接受接口(interface)类型而不是参数的新方法

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

这是旧方法 - 不再需要 public Image CreatePreviewImg(string value, int fontSize, int x, int y) { //初始化条形码字体
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;
}
}

关于c# - 我的项目中的接口(interface)实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9194815/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com