【发布时间】:2012-03-14 19:42:44
【问题描述】:
我有一组表示文件中字体格式存储的类。每种字体都定义了一组字形(一种映射到 UTF32 代码的形状)。
字形可以用轮廓(在我的例子中是一组贝塞尔曲线)或位图来表示。
我的第一个想法是,这会导致 GlyphOutline 和 GlyphBitmap 类继承自 Glyph。
这种设计唯一的问题是没有通用的方法。为了对这两个类做任何有用的事情,我需要使用 rtti(我宁愿避免)。
我的问题是:您能想出一种更好的方式来表示字形/是否有一些设计模式可以处理这种情况?
我试图让这种语言不可知,但如果有什么不同,我会用 c++ 编写。
编辑:
我考虑过使用泛型,其中 Glyph 包含对一些/许多 GlyphRepresentations 的引用,其中 T 将是 Outline 或 Bitmap 或您可以用来表示字形的任何其他内容。我实际上非常喜欢这个作为解决方案,因为它解决了由 Outline 和 Bitmap 表示的字形问题。但是它会强制使用 rtti。
这可能是我在使用 c# 时会选择的解决方案明白我很想避免
编辑:
在回答 oli 时,我同意你的观点,但是 isa 关系(如 GlyphOutline 中的 Glyph 是一个 Glyph,并且可以做一个字形可以做的所有事情)是存在的,我认为这意味着应该有继承?我不确定这一点,似乎两种方式都有很好的论据。
到目前为止,我首选的解决方案是访问者模式,但这只是评论而不是答案,我想再等一会儿,看看是否有其他解决方案浮出水面。
【问题讨论】:
-
你不能在上面做模板,没有继承吗?对于那些你想使用 RTTI 的情况,为什么它们不能是虚拟成员函数?
-
如果我们更多地了解
Glyph实例的使用方式,将会有所帮助。你没有做多态性,这……很奇怪。 -
如果你没有共同的行为,那么从一个共同的基类派生可能没有意义。
-
查看访客模式。这可能是避免 rtti 的方法。
-
你绝对应该有一个接口,比如说 IGlyph,这两个类都会实现。 IGlyph 将提供将对象视为一组贝塞尔曲线的方法。您可以为此目的使用纯抽象基类。