Sprawa próbuję wdrożyć tutaj jest klasa bazowa, która ma funkcję (nazwijmy to modify_command), które mogą przyjmować wiele różnych rodzajów praktycznie tak Klasy pochodne mogą realizować funkcję modify_command jak uważają za stosowne. Teraz mam coś wzdłuż tych linii w klasie bazowej:Projektowanie w C++: Przeciążanie/Nadpisywanie wielu funkcji, czyszczenie?
class Base
{
template<typename Command>
void modify_command(Command cmd)
{
std::cout << "Modify command called with unimplemented command type:" << typeid(cmd).name();
}
virtual void modify_command(SpecificCommandA cmd)
{
modify_command<SpecificCommandA>(cmd); // Calls the templated function
}
virtual void modify_command(SpecificCommandB cmd)
{
modify_command<SpecificCommandB>(cmd); // Calls the templated function
}
// etc.
};
Następnie w klasie pochodnej:
class Derived : public Base
{
virtual void modify_command(SpecificCommandA cmd)
{
cmd.x = 1;
cmd.y = 2;
}
}
Oczywiście funkcja wirtualnego szablon nie jest możliwe więc w jakiejś formie jestem będzie musiała wymieniać deklaracje funkcji dla wielu różnych argumentów, co z pewnością zakłóci definicję klasy i może utrudnić (z czasem) dodatkowe typy poleceń, które mają być obsługiwane.
Celem posiadania templatu Funkcja ed jest w tym przypadku kompilacji bez potrzeby definicji modify_command (SpecificCommandC) do logowania błąd:
Base * base = new Derived();
SpecificCommandA a;
SpecificCommandB b;
SpecificCommandC c;
base->modify_command(a); //Set's x and y
base->modify_command(b); //Outputs that command type is unimplemented
base->modify_command(c); //Outputs that command type is unimplemented
Nienawidzę jak mam to działa, czy ktoś ma sugestie, w jaki sposób może to być czyszczone/zreimplementowany? Liczba poleceń będzie rosła wraz z dojrzewaniem oprogramowania, więc niezbędna jest rozszerzalność.
Edit: Gramatyka
Utwórz klasę bazową SpecificCommand z funkcją składową, np. onModifyCommand, która wywołuje modify_command. – kfsone
@kfsone Nie jestem pewien, czy rozumiem co masz na myśli. Każda z moich klas pochodnych zmodyfikuje komendę inaczej (czasem wcale). W jaki sposób dałoby to moim Derywacjom możliwość określenia własnej implementacji do modyfikacji polecenia? – mascoj
Wygląda na to, że potrzebujesz odpowiednika funkcji wirtualnego szablonu bez konieczności deklarowania wszystkich konkretnych przeciążeń w klasach pochodnych jako funkcji wirtualnych w klasie bazowej. Proszę potwierdzić – EdMaster