我会选择一个通用接口和一个通用父类,并且可能还使用构建器模式……;
a common partialFooBar interface
a common fooBarChimera parent class
然后,您可能会将您的转换器放入 fooBarChimera 父级(并强制执行所需的额外细节以完成您想要的任何一个。
您可能还想使用构建器模式。
让它充实一点……
即第一堂课
partialFooBarBuilder
有一个简单的默认构造函数和设置方法。
最后一个方法会将这个类“转换”为“完整”版本,或 fooBarChimera,然后只需要在其中包含“getter”方法。
正确的版本仅可从此构建器类(或 fooBarChimera)中获得,因此您可以在返回最终正确的 foo 类之前更轻松地强制内容处于良好状态(如果它被链接,您可以通过一些很好的错误处理来做到这一点到您的用户界面)。
所以你最终会得到类似...
public class buildpartFooBar implement fooBarCommon{
//fooBarCommon is the interface the enforces the commonality of between the 2 objects.
public buildPartFooBar(){...}
...[various setter methods here ....]
//make the different types of object we may become
private foo1 makeFoo1(iNeedThisToBeAFoo1 object){...}
private foo2 makeFoo2(iNeedThisToBeAFoo2 object){...}
private bar1 makeBar1(iNeedThisToBeABar1 object){...}
private bar2 makeBar2 (iNeedThisToBeABar2 object){...}
private fooBarChimera makeChimera (){...}
}//buildPartFooBar 类结束
然后很容易包含一个方法 makeFooFromBar,您可以在其中返回 foo1 或 Foo2 或您喜欢的任何内容,您可能会通过 fooBarChimera 类中的静态方法来执行此操作
请记住,您将需要处理转换后的 bar 和 foo 类相互关联的情况(您可能需要实现某种形式的具有 bar 键和 foo 对象的集合,或者这应该在您的 fooBarChimera 中实现某处)。
您可能会决定 foo 和 bar 也需要类似的方法,例如,将这些方法作为静态比较包含在 fooBarChimera 中可能是明智的。这样,您只需要在父级中编写一次。
canThisFooBeBar
和
canThisBarBeFoo
这样在创建时您可以比较它们并决定它们是否应该自动链接,然后如果您的收藏中已经存在链接,则可以节省转换操作。
您还需要确定转换是否为 2 路,foo 可以是 bar,但 bar 可能与 2 foo 兼容。
在这种情况下,您可能决定转到可以处理此类事情的数据库并将您的 foo 和 bar 对象存储在其中,这也可能比自定义的集合类更容易,尤其是如果您为每个 foo 和 bar 赋予唯一性对象 ID(指导)。
它可能会变得更先进......这取决于你打算把它带到哪里,听起来像你自己设定的一个有趣的任务,我们可以问你为什么要这样做吗?
我可能只是为了好玩而做的事情......就像当我根据 java 集合对遗留数据库进行建模时,才意识到我是多么愚蠢,只是将其转换为更明智的数据库。
大卫