Дизайн класса для двух объектов, которые являются производными от одного класса, но не имеют общих методов - PullRequest
2 голосов
/ 24 февраля 2012

У меня есть набор классов, которые представляют хранение формата шрифта в файле. Каждый шрифт определяет набор символов (форма, которая отображается в код UTF32).

Глифы могут быть представлены контуром (набор кривых Безье в моем случае) или растровым изображением.

Моя первая мысль была о том, что это приведет к классам GlyphOutline и GlyphBitmap, которые наследуются от Glyph.

Единственная проблема с этим дизайном состоит в том, что нет общих методов. Чтобы сделать что-нибудь полезное с любым классом, мне нужно было бы использовать rtti (которого я предпочел бы избежать).

У меня такой вопрос: можете ли вы придумать лучший способ изобразить глиф / есть ли какой-то шаблон проектирования, который имеет дело с этой ситуацией?

Я пытался сделать этот язык независимым, но я пишу на c ++, если это что-то меняет.

EDIT:

Я рассмотрел использование обобщений, где Glyph содержит ссылку на некоторые / многие GlyphRepresentations, где T будет Outline или Bitmap или что-либо еще, что вы можете использовать для представления глифа. На самом деле мне очень нравится это решение, так как оно решает проблему глифа, представленного как Outline и Bitmap. Однако это заставит использовать RTI.

Это, вероятно, решение, которое я бы выбрал, если бы использовал c #, где отражение замечательно и приятно, но в среде c ++, в которой я работаю, rtti реализован как набор очень сложных макросов, которые, я уверен, вы можете понимаю, я очень хочу избежать

EDIT:

Отвечая на вопрос oli, я согласен с вами в какой-то степени, но отношения isa (как в GlyphOutline - это Glyph, и может делать все, что может делать глиф), что, как я считаю, подразумевает, что должно быть наследование. ? Я не уверен в этом, похоже, в любом случае есть веские аргументы.

Мое предпочтительное решение до сих пор - шаблон посетителя, но это просто комментарий, а не ответ, и я хотел бы подождать немного дольше, чтобы увидеть, появляются ли какие-либо другие решения.

Ответы [ 3 ]

2 голосов
/ 24 февраля 2012

Звучит так, как если бы такие методы, как drawOnScreen(), getMetrics(), getCodePoint() были бы хорошими кандидатами для полиморфного поведения.

1 голос
/ 24 февраля 2012

Что ж, если я вас правильно понимаю, вы можете использовать шаблон проектирования 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()
0 голосов
/ 24 февраля 2012

Я голосую за шаблоны и интерфейсы !!Не могу использовать наследование, потому что нет общего поведения.И я не очень понимаю, почему вы должны избегать RTTI, это одна из лучших функций языка.Если ваш текущий шаблон проектирования с RTTI решает проблему, зачем менять?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...