У меня была эта проблема, щекочущая меня последние недели; моя текущая реализация работает, но мне любопытно узнать, есть ли «хороший способ» сделать это. Я новичок в разработке шаблонов, так что это может быть глупым вопросом.
Проще говоря, у вас есть:
Моя проблема в этом; конкретные реализации ядер могут определять свой собственный набор параметров, которые отличаются от одного ядра к другому.
Foo использует ядра для некоторой обработки, но эта обработка в конечном итоге зависит от этих параметров, и я не знаю, как их правильно настроить.
Я не хочу переходить на абстрактную фабрику и настраивать бетонную фабрику перед сборкой, потому что мне это кажется неправильным; это не фабрика с параметрами, а ядро.
Но с другой стороны, даже если я установлю указатель ядра в Foo как public, я не смогу получить доступ к параметрам базового ядра, поскольку они не являются частью интерфейса прототипа … Я уверен, что другие люди имели это проблема раньше, может быть, есть простое решение, которое я не вижу. : S
Заранее спасибо!
ПРИМЕЧАНИЕ: в моей текущей реализации нет Фабрики ядра. Я поместил конкретный тип ядра в качестве шаблона Foo и установил ядро в качестве открытого члена, что позволяет мне конфигурировать ядро после объявления и перед началом обработки.
Если фрагмент кода знает, с каким конкретным типом ядра он работает, он должен иметь указатель на этот конкретный конкретный тип ядра. Если это не так, он не может получить доступ к своим конкретным параметрам (но, возможно, может получить доступ ко всем параметрам в общем виде, как предложено @Jaywalker).
Ваша текущая реализация, кажется, идет по первому пути, что совершенно нормально.
У меня очень ограниченная информация о вашем дизайне, но похоже, что у вас есть несколько конкретных типов ядра, отдельный компоновщик для каждого типа и отдельный конфигуратор для каждого типа. Упаковать всех сборщиков в Factory проблематично, поскольку нет простого и элегантного способа пересылки конкретных типов ядра в соответствующие конфигураторы (без таких вещей, как *_cast<>
или двойная отправка). Есть как минимум два способа решить эту проблему, но у нас есть Фабрика:
Все, что не является частью интерфейса прототипа, не будет доступно в Foo
, как вы сказали. Использовать фабричный шаблон просто не имеет смысла, если Foo
знает специфику каждой реализации ядра.
В некоторых ограниченных случаях добавление чего-то вроде следующих методов получения и установки в интерфейсе прототипа может сделать вашу работу:
virtual bool setParameter (const string &key, const string &value) = 0;
virtual string getParameter (const string &key) = 0;