Следует ли избегать снижения рейтинга при использовании иерархии классов в C ++? - PullRequest
1 голос
/ 11 января 2011

Допустим, я пишу приложение, которое работает с проектами и предоставляет различные функциональные возможности в зависимости от типа проекта. У меня есть иерархия классов для разных типов проектов:

class AbstractProject
{
};

class ProjectA : public AbstractProject
{
};

class ProjectB : public AbstractProject
{
};

class ProjectC : public AbstractProject
{
};

Теперь я планировал иметь указатель AbstractProject * _currentProject в качестве члена в главном классе приложения, открывать диалоговое окно при запуске и на основе выбора делать:

_currentProject = new ProjectB(); // e.g.

Позже мне придется понизить указатель на конкретный тип, чтобы использовать функциональность, специфичную для разных Project-ов. Почему-то это заставляет меня чувствовать себя неловко. Есть ли лучший способ сделать это?

Ответы [ 4 ]

2 голосов
/ 11 января 2011

Лучший способ - определить чисто виртуальные методы в базовом классе, а затем реализовать все специфические функции в перегрузках в производных классах. Затем вызовите этот метод.

2 голосов
/ 11 января 2011

Да, вы должны использовать вместо этого виртуальные методы, когда это возможно.

1 голос
/ 11 января 2011

Здесь могут применяться оба шаблона: Command и Visitor.Вы должны решить для себя, что лучше подходит для вашего случая.

http://en.wikipedia.org/wiki/Command_pattern

http://en.wikipedia.org/wiki/Visitor_pattern

0 голосов
/ 11 января 2011

В чистом виде у вас должны быть виртуальные методы, как все предлагали. Тем не менее, если вам все еще нужно перейти к определенным функциям-членам, попробуйте использовать один из шаблонов проектирования, может быть команда или посетитель или даже декоратор ...

...