типа я наткнулся некоторым код сегодня, что были похожи на:Замена условных цепи проверки
if (myObject is MyClass1)
myOtherObject = new MyOtherClass1(myObject);
else if (myObject is MyClass2)
myOtherObject = new MyOtherClass2(myObject);
else if (myObject is MyClass3)
myOtherObject = new MyOtherClass3(myObject);
else if (myObject is MyClass4)
myOtherObject = new MyOtherClass4(myObject);
else if (myObject is MyClass5)
myOtherObject = new MyOtherClass5(myObject);
else if (myObject is MyClass6)
// ...
Я нахожу это довольно трудно поддерживать, и хотели бы заменить его чем-то менее громоздким. Какие у меня варианты?
До сих пор я рассматривал подход, основанный на таблицах, используя словарь, но я не уверен, что это лучший вариант.
// Not even sure this is valid syntax.
foreach (myClass in classes)
if myObject is myClass
new classes[myClass](myObject);
Другие идеи?
Update
Не вдаваясь в подробности многих здесь основная структура классов:
MyBaseClass MyOtherBaseClass
| |
-MyClass1 -MyOtherClass1
| |
-MyClass2 -MyOtherClass2
MyBaseClass и его потомки, что я хотел бы рассмотреть постоянные объекты передачи данных. Они хранят свои данные в определенном классе формате.
Ближе всего я могу описать MyOtherBaseClass, и его потомками будут однонаправленные карты данных [PoEAA], но они также смешивают небольшую бизнес-логику.
В базе данных хранится достаточно информации для поиска объектов и отслеживания их состояния.
Каким образом 'MyOtherClass1',' MyOtherClass2 'и другие отличаются друг от друга? –
Все они сходят с одного базового класса, но каждый переопределяет методы базового класса с различными реализациями. Я понимаю, что две иерархии классов тесно связаны. Это устаревший код, после завершения. –
@codeelegance: хорошо, я думал, что, возможно, дженерики могут быть полезны, но, вероятно, это не так. –