Попал в немного нестандартную ситуацию. Вводная такова:
Есть группа файлов, в каждом из которых — стопка классов. Файлы с классами генерируются автоматически, на основе xml-ек, при помощи специальной тулзы, соответственно, править код в них мы не имеем права, так как при следующей перегенерации — все пропадет.
Радует одно — все классы объявлены как partial, соответственно недостающий код к ним можно дописывать, создавая новые файлы. Раньше делали просто — для каждой связки xml+сгенереный cs — писали имя_файла_ext.cs, в котором и дописывали все, что надо.
Но, проект разросся, а структура xml-ек, соответственно, как и сгенеренных классов — почти не отличаются, а уж ext-файлы вообще почти идентичны. Итого, выросла стопка копипащенного кода, что есть плохо.
Отсюда возникает вопрос — как уйти от множественных ext файлов, перейдя к одному какому-то. Соответственно, в идеале бы получить возможность создавать объект не какого-то конкретного типа из сгенеренных, а некоего надкласса, и на месте уже кастовать его к одному из сгенеренных, получая дополнительный функционал. Но, сгенеренные классы — уже наследованы от неких стандартных классов, а множественного наследования в C# нет.
Вот и вопрос — вообще возможно решить эту проблему?
Здравствуйте, Namelles.One, Вы писали:
NO>Попал в немного нестандартную ситуацию. Вводная такова: NO>Есть группа файлов, в каждом из которых — стопка классов. Файлы с классами генерируются автоматически, на основе xml-ек, при помощи специальной тулзы, соответственно, править код в них мы не имеем права, так как при следующей перегенерации — все пропадет. NO>Радует одно — все классы объявлены как partial, соответственно недостающий код к ним можно дописывать, создавая новые файлы. Раньше делали просто — для каждой связки xml+сгенереный cs — писали имя_файла_ext.cs, в котором и дописывали все, что надо. NO>Но, проект разросся, а структура xml-ек, соответственно, как и сгенеренных классов — почти не отличаются, а уж ext-файлы вообще почти идентичны. Итого, выросла стопка копипащенного кода, что есть плохо. NO>Отсюда возникает вопрос — как уйти от множественных ext файлов, перейдя к одному какому-то. Соответственно, в идеале бы получить возможность создавать объект не какого-то конкретного типа из сгенеренных, а некоего надкласса, и на месте уже кастовать его к одному из сгенеренных, получая дополнительный функционал. Но, сгенеренные классы — уже наследованы от неких стандартных классов, а множественного наследования в C# нет. NO>Вот и вопрос — вообще возможно решить эту проблему?
А что мешашает генерить "ext-файлы", а не копипейстить их? Если ли в этих файлах какая-то специфика используемого типа?
Help will always be given at Hogwarts to those who ask for it.
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, Namelles.One, Вы писали:
NO>>...а множественного наследования в C# нет. Вот и вопрос — вообще возможно решить эту проблему?
Q>Заменить наследование аггрегацией?
Не уверен, что она поможет, так как в коде из ext файлов приходится много использовать приватные поля и методы сгенереных классов. Агрегация же, насколько я понимаю, лишит нас такой возможности? Или я неправ?
Здравствуйте, _FRED_, Вы писали:
_FR>Здравствуйте, Namelles.One, Вы писали:
NO>>Попал в немного нестандартную ситуацию. Вводная такова: NO>>Есть группа файлов, в каждом из которых — стопка классов. Файлы с классами генерируются автоматически, на основе xml-ек, при помощи специальной тулзы, соответственно, править код в них мы не имеем права, так как при следующей перегенерации — все пропадет. NO>>Радует одно — все классы объявлены как partial, соответственно недостающий код к ним можно дописывать, создавая новые файлы. Раньше делали просто — для каждой связки xml+сгенереный cs — писали имя_файла_ext.cs, в котором и дописывали все, что надо. NO>>Но, проект разросся, а структура xml-ек, соответственно, как и сгенеренных классов — почти не отличаются, а уж ext-файлы вообще почти идентичны. Итого, выросла стопка копипащенного кода, что есть плохо. NO>>Отсюда возникает вопрос — как уйти от множественных ext файлов, перейдя к одному какому-то. Соответственно, в идеале бы получить возможность создавать объект не какого-то конкретного типа из сгенеренных, а некоего надкласса, и на месте уже кастовать его к одному из сгенеренных, получая дополнительный функционал. Но, сгенеренные классы — уже наследованы от неких стандартных классов, а множественного наследования в C# нет. NO>>Вот и вопрос — вообще возможно решить эту проблему?
_FR>А что мешашает генерить "ext-файлы", а не копипейстить их? Если ли в этих файлах какая-то специфика используемого типа?
Вот это уже интересная идея. Вообще уже возникла мысль доработать код генератора. Просто писал его не я и, это последнее, к чему хотелось бы прибегать — боюсь погрязнуть по колено в коде...
Здравствуйте, Namelles.One, Вы писали:
NO>Здравствуйте, Qbit86, Вы писали:
Q>>Здравствуйте, Namelles.One, Вы писали:
NO>>>...а множественного наследования в C# нет. Вот и вопрос — вообще возможно решить эту проблему?
Q>>Заменить наследование аггрегацией?
NO>Не уверен, что она поможет, так как в коде из ext файлов приходится много использовать приватные поля и методы сгенереных классов. Агрегация же, насколько я понимаю, лишит нас такой возможности? Или я неправ?
так, ты сказал, что код всех ext файлов практически идентичен, значит в каждом из генерированных классов идентичный набор прайвет полей?? ИМХО тогда можно заюать паттерн "паблик морозов". В ext файлах для всех классов нагенить реализацию интерфейса (лучше явную реализацию), который дает доступ к нужным вам полям. Ну и соответсвенно вынести все логику в отдельный класс, который агрегирует этот интерфейс, либо экстеншены для этого интерфейса наваять.
Здравствуйте, Jack128, Вы писали:
J>либо экстеншены для этого интерфейса наваять.
Экстеншн-методы в сгенерённом коде вообще не нужны, и даже противопоказаны. Экстеншн-методы в C# — это синтаксический сахар для вызова метода. Зечем он в коде, где вызов методов генерируется?
Здравствуйте, Qbit86, Вы писали:
Q>Здравствуйте, Jack128, Вы писали:
J>>либо экстеншены для этого интерфейса наваять.
Q>Экстеншн-методы в сгенерённом коде вообще не нужны, и даже противопоказаны. Экстеншн-методы в C# — это синтаксический сахар для вызова метода. Зечем он в коде, где вызов методов генерируется?
э-э-э. Откуда следую, что _вызов_ методов из ext файлов генериться??