【问题标题】:Multiple Importer/Exporter Methods with Different Parameters具有不同参数的多个导入器/导出器方法
【发布时间】:2011-09-04 03:29:42
【问题描述】:

我有 2 个导出器方法(计划有更多),它们基本上从我的 sprite 制作器中获取我的 sprite 定义,并将其导出到一个 PNG 文件和一个描述 PNG 的 XML 文件中。现在,我已经将这两种方法塞进了我的 Sprite 类中进行测试,但它们并不真正属于那里。所以我想如果我为exporters和importers做一个接口,然后为每种类型的importer/exporter创建一个类就好了,对吧?

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

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

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

现有导出器的 XML 相同,但 PNG 不同。以后的某个时间,我可能希望拥有其他类型的元数据导出器,例如 JSON。

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

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

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

(我在问题中添加了“Importer”,因为有一天我想将进口商添加到这些出口商)

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

【问题讨论】:

    标签: c# architecture interface


    【解决方案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(...) {...};
    }
    

    【讨论】:

      【解决方案2】:

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

      对此的一种变体(但不是唯一的变体)是通过输入(他们可以导出什么)对出口商进行分类/组织。

      与其说IPNGExporter.ExportToPNG(Sprite),不如说IPNGExporter.ExportToPNG(IExportable)

      你可以更进一步说IExportableToImage,但我不明白这会如何真正增加我的脑海中的价值。

      【讨论】:

      • 有趣,这让我开始思考。我让我的出口商出口 2 个文件的原因是因为这两个文件是紧密耦合的(一个描述另一个)。我确实喜欢为每种类型的输出使用不同方法的想法,如果不是完全不同的导出器类的话。我会尝试这个想法,让你知道我要去哪里。谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-29
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-06-04
      相关资源
      最近更新 更多