Mam nadzieję, że kod rozjaśni o co mi chodzi ale mówiąc krótko mam jedną klasę w publicznym API która w konstruktorze przyjmuje enuma a na jego podstawie jest tworzony wewnętrznie konkretny obiekt klasy bazowej.
Pseudokod:
class AbstractDevice
{
public:
virtual void run();
};
class LocalDevice : public AbstractDevice
{
public:
void run() override;
// have specicifc options
};
class RemoteDevice : public AbstractDevice
{
public:
void run() override;
// have specicifc options
};
// API class
class Device
{
public:
enum class Type {
Local,
Remote
};
explicit Device(Device::Type type);
void run();
};
I teraz szukam najlepszego sposobu na ustawianie opcji / konfiguracji klasy device a właściwie localDevice lub remoteDevice. Problem w tym, że nie wszystkie opcje są wspólne, istnieją takie ale każda ma też swoje unikalne więc mógłbym zrobić tak jak jest to w Qt że mam sporego enuma ze wszystkimi możliwymi opcjami dla wszystkich klas i w dokumentacji piszę że opcja x ma zastosowanie tylko do klasy localDevice a opcja y jest dla wszystkich itd.
I wtedy w API mogłoby to wyglądać tak:
Device device(Device::Type::Local);
device.setOption(Device::CryptographicHash, Device::Sha2);
device.run(); // -> LocalDevice::run();
Czy coś takiego wygląda ok? Czy jest lepszy sposób na tego typu problemy? Jakiś wzorzec?