两个对象的类设计,它们派生自同一个类但没有共同的方法

时间:2012-02-24 10:43:00

标签: c++ oop

我有一组表示文件中字体格式存储的类。每种字体都定义了一组字形(一种映射到UTF32代码的形状)。

字形可以用轮廓(在我的例子中是一组贝塞尔曲线)或位图来表示。

我的第一个想法是,这将导致GlyphOutline和GlyphBitmap类继承自Glyph。

这种设计的唯一问题是没有通用的方法。为了对任何一个类做任何有用的事情,我需要使用rtti(我宁愿避免)。

我的问题是:你能想到一种更好的方式来表示一个字形/是否有一些设计模式可以解决这种情况?

我试图让这种语言不可知,但如果它有任何区别,我会用c ++编写。

编辑:

我考虑过使用泛型,其中Glyph包含对某些/许多GlyphRepresentations的依据,其中T将是Outline或Bitmap或者您可以用来表示字形的任何其他内容。我实际上非常喜欢这个解决方案,因为它解决了由Outline和Bitmap表示的字形问题。但是它会强制使用rtti。

这可能是我选择的解决方案,如果我使用c#,其中反射是美妙而且很好,但在c ++环境中,我在rtti工作是作为一组非常复杂的宏实现的,我相信你可以理解我非常希望避免

编辑:

在回答oli时,我同意你的观点,但是isa关系(如GlyphOutline中的字形,可以做字形可以做的所有事情)就在那里,我相信这意味着应该有继承?我不确定这一点,似乎有任何好的论据。

到目前为止我的首选解决方案是访问者模式,但这只是一个评论而不是答案atm,我想再等一会儿,看看是否有任何其他解决方案。

3 个答案:

答案 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的设计模式解决了问题,为什么要改变?