我有一组表示文件中字体格式存储的类。每种字体都定义了一组字形(一种映射到UTF32代码的形状)。
字形可以用轮廓(在我的例子中是一组贝塞尔曲线)或位图来表示。
我的第一个想法是,这将导致GlyphOutline和GlyphBitmap类继承自Glyph。
这种设计的唯一问题是没有通用的方法。为了对任何一个类做任何有用的事情,我需要使用rtti(我宁愿避免)。
我的问题是:你能想到一种更好的方式来表示一个字形/是否有一些设计模式可以解决这种情况?
我试图让这种语言不可知,但如果它有任何区别,我会用c ++编写。
编辑:
我考虑过使用泛型,其中Glyph包含对某些/许多GlyphRepresentations的依据,其中T将是Outline或Bitmap或者您可以用来表示字形的任何其他内容。我实际上非常喜欢这个解决方案,因为它解决了由Outline和Bitmap表示的字形问题。但是它会强制使用rtti。
这可能是我选择的解决方案,如果我使用c#,其中反射是美妙而且很好,但在c ++环境中,我在rtti工作是作为一组非常复杂的宏实现的,我相信你可以理解我非常希望避免
编辑:
在回答oli时,我同意你的观点,但是isa关系(如GlyphOutline中的字形,可以做字形可以做的所有事情)就在那里,我相信这意味着应该有继承?我不确定这一点,似乎有任何好的论据。
到目前为止我的首选解决方案是访问者模式,但这只是一个评论而不是答案atm,我想再等一会儿,看看是否有任何其他解决方案。
答案 0 :(得分:2)
听起来好像drawOnScreen()
,getMetrics()
,getCodePoint()
这样的方法会成为多态行为的好选择。
答案 1 :(得分:1)
好吧,如果我理解正确,你可以按如下方式使用Builder设计模式:
可以定义一组字形。每个Glyph都将实现IGlyph接口,该接口将允许Font类的实例访问贝塞尔曲线集。
class OutlineGlyph : public IGlyph
class BitmapGlyph : public IGlyph
然后一个实例化其中一些并通过它们的具体接口设置它们。
OutlineGlyph og;
og.Method(...)
然后应该实例化FontBuilder类。
FontBuilder fontBuilder;
fontBuilder.AddGlyph(og);
fontBuilder.AddGlyph(bg);
Font* font = fontBuilder.CompileFont()
答案 2 :(得分:0)
我投票给模板和界面!!不能使用继承,因为没有共同的行为。我真的不明白为什么你应该避免RTTI这个语言的更好的功能之一。如果您当前使用RTTI的设计模式解决了问题,为什么要改变?