Я пытаюсь написать абстрактный класс C++, и я не могу понять, как требовать от реализаторов этого класса содержать статическую функцию.C++: требуется статическая функция в абстрактном классе
Например:
class AbstractCoolThingDoer
{
void dosomethingcool() = 0; // now if you implement this class
// you better do this
}
class CoolThingDoerUsingAlgorithmA: public AbstractCoolthingDoer
{
void dosomethingcool()
{
//do something cool using Algorithm A
}
}
class CoolThingDoerUsingAlgorithmB: public AbstractCoolthingDoer
{
void dosomethingcool()
{
//do the same thing using Algorithm B
}
}
Теперь я хотел бы сделать coolthing без деталей, как coolthing будет сделано. Так что я хотел бы сделать что-то вроде
AbstractCoolThingDoer:dosomethingcool();
без необходимости знать, как coolthing будет сделано, но это, кажется, требуется функция, которая одновременно является виртуальной и статическим, который, конечно, противоречие.
Обоснование заключается в том, что CoolThingDoerUsingAlgorithmB может быть написан позже, и, надеюсь, программный продукт, который нуждается в прохладных вещах, не должен быть переписан.
РЕДАКТИРОВАТЬ: Не уверен, что я понял, чего я пытаюсь достичь. У меня есть 3 критерии, которые я ищу, чтобы удовлетворить
библиотека, которая использует abstractcoolthingdoer и не должны быть переписаны когда-либо, даже если другой coolthingdoer написано, что библиотека никогда не слышал.
Если вы попытаетесь написать coolthingdoer, который не соответствует требуемой структуре, исполняемый файл, который использует библиотеку, не будет компилироваться.
coolthingdoer имеет некоторые статические функции, которые требуются.
Я, вероятно, преследую плохой дизайн, поэтому, пожалуйста, укажите мне лучший вариант. Мне нужен завод?
И как именно будет 'реализация CoolThingDoerUsingAlgorithmB' в забрать? – juanchopanza
Вам разрешено предоставлять реализации для чистых виртуальных функций.Таким образом, обеспечить (вне очереди) реализацию 'AbstractCoolThingDoer :: dosomethingcool', а производные классы по-прежнему будут вынуждены переопределять виртуальную функцию, но те, которые не хотят делать * холодную вещь * по-разному, могут по-прежнему звонить реализация базового класса по умолчанию явно в пределах их тела. – Praetorian
Возможно, в этом случае вы можете просто определить указатель на «void dosomethingcool()» и объявить его членом в AbstractCoolThingDoer? – vasylz