Piszę część ogólnego oprogramowania, które zostanie załadowane na wiele różnych wariantów tego samego podstawowego sprzętu. Wszystkie mają ten sam procesor, ale z różnymi urządzeniami peryferyjnymi i ich własnymi funkcjami, które trzeba wykonać. Oprogramowanie będzie wiedzieć, który wariant powinien działać, czytając wartość przełącznika sprzętowego.Tworzenie dynamicznego typu w C++
Oto moja aktualna implementacja w pigułce:
class MyBase
{
public:
MyBase() { }
virtual run() = 0;
}
class VariantA : public MyBase
{
public:
VariantA() { }
virtual run()
{
// Run code specific to hardware Variant-A
}
}
class VariantB : public MyBase
{
public:
VariantB() { }
virtual run()
{
// Run code specific to hardware Variant-B
}
}
void main()
{
MyBase* variant;
uint_8 switchValue = readSwitchValue();
switch(switchValue)
{
case 0:
variant = new VariantA();
break;
case 1:
variant = new VariantB();
break;
}
variant->run();
}
Teraz działa to dobrze. Odczytuję wartość sprzętową i używam instrukcji switch do utworzenia nowej odpowiedniej klasy.
Problem polega na tym, że mam do wyboru wiele wariantów. Obecnie około 15, z potencjałem, aby dodać kolejne 20-30 w najbliższej przyszłości. Naprawdę nienawidzę instrukcji switch, które działają setki wierszy, więc naprawdę szukam lepszego sposobu na zrobienie tego, prawdopodobnie poprzez szablony.
Chcę móc używać mojej wartości sprzętowej do wyszukiwania typu i używać tego typu do tworzenia nowego obiektu. Idealnie, gdy dodaję nowy wariant, tworzę nową klasę, dodam ten typ klasy do mojej tablicy odnośników z jej dopasowaną wartością sprzętową i dobrze jest iść.
Czy to w ogóle możliwe? Jakie jest dobre rozwiązanie?
Osobiście Myślę, że blok "switch/case" do stworzenia odpowiedniej klasy jest prawdopodobnie optymalnym rozwiązaniem. Wystarczy umieścić instrukcję case w statycznej "fabrycznej" metodzie, która zwraca odniesienie do konkretnej klasy. IMHO ... Oto dobry przykład: http://stackoverflow.com/questions/7468104/factory-method-design-pattern – paulsm4
Czy sprzęt można poznawać tylko w środowisku wykonawczym? –
spójrz na tę konkretną [odpowiedź] (http://stackoverflow.com/questions/15977617/polymorphism-with-new-data-members/15978673#15978673), która opisuje sposób budowy fabryki obiektów poprzez rejestrację konstruktorów . Warto spojrzeć na oryginalny pomysł wspomniany w poście. – didierc