具有不同参数的多个导入器/导出器方法

时间:2011-09-02 00:08:07

标签: c# architecture interface

我有2个导出器方法(计划有更多),它基本上从我的精灵制作器中获取我的精灵定义,并将其导出到PNG文件和描述PNG的XML文件中。现在,我把这两个方法塞进我的Sprite类进行测试,但它们并不属于那里。所以我认为如果我为出口商和进口商建立了一个界面,那么每种类型的进口商/出口商都有一个类,对吧?

现在问题是我的两个方法没有相同的参数,所以我不能很容易地使用接口。

第一个出口商是一个“有组织的”出口商,它以人类可以轻易遵循的方式出口框架,没有任何限制。它只需要精灵定义,文件名(没有扩展名)然后生成这对文件。

第二个导出器是一个最佳打包导出器,它将采用相同的参数加上最大宽度和高度。现在它不是最佳的,它不会重新调整框架的大小,它只是选择适合的下一个插槽。也许还有其他选项(参数),我还没有想到这个方法。

现有出口商的XML相同,但PNG不同。未来一段时间,我可能希望有其他类型的元数据导出器,如JSON。

对于现有出口商,他们都遵循这种模式:

  • 确定输出PNG的大小(每种方法不同
  • 制作具有该尺寸的位图对象
  • 设置并开始写入我的XML文件
  • 写出一堆与框架无关的元数据
  • 遍历每个序列(比看起来多一点)
    • 每帧:
      • 找出框架的去向(每种方法的
      • 写下有关此框架的信息,包括精灵表位置和&从上面的大小
      • 将帧绘制到位置&处的输出位图。上面计算的大小
  • 保存并关闭文件

我可以根据要求提供代码链接。

(我在问题中添加了“导入器”,因为我希望有一天能将导入器添加到这些导出器中)

关于如何将这些导出器从我的Sprite类中拉出来以及如何保持它们相关的任何建议?

2 个答案:

答案 0 :(得分:1)

我为每个唯一目标定义了一个导出器(PNG,XML等)。 然后,我将构建实现一个或多个这些接口的Exporter类。 您可以通过工厂实例化这些(“给我所有处理PNG /图像的导出器”)。其中一个是SpriteExporter

对此(但不是排他性的)的变体是按输入对出口商进行分类/组织(他们可以输出什么)。

而不是说IPNGExporter.ExportToPNG(Sprite)你会说IPNGExporter.ExportToPNG(IExportable)

你可以更进一步说IExportableToImage,但我不知道这会如何真正增加我的头脑。

答案 1 :(得分:1)

我想最好是创建一些基本导出类,它只在addSpritesaveToFile等所有导出类之间共享一些基本功能。之后你可以创建一些继承这个类的其他类加上它们具有添加保存参数的特定功能,如下所示:

class baseExported
{
    public abstract void addSprite(Bitmap texture);
    public abstract bool export(String target);
};

class ExporterA : baseExporter
{
    public override void addSprite(...) {...};
    public override bool export(...) {...};
}

class ExporterB : baseExporter
{
    public override void addSprite(...) {...};
    public override void setMaxDimentions(int maxHeight,int maxWidth) {...};
    public override bool export(...) {...};
}

class ExporterC : baseExporter
{
    public override void addSprite(...) {...};
    public override void setMaxDimentions(int maxHeight,int maxWidth) {...};
    public override void addMetaData(String someData) {...};
    public override bool export(...) {...};
}