2010-07-07 3 views
0

У меня есть класс, который я написал довольно рано в своем опыте программирования vb.net, который унаследовал от другого класса, который он действительно должен был составить. Базовый класс представляет собой относительно общую вложенную сборку на основе словаря; назовем класс потомков «Автомобилем».Рефакторинг наследования с использованием Vbex2005

В настоящее время существует много кода, который делает такие вещи, как «MyCar! Color.st =« Red »(я использую общую коллекцию, а не реальные свойства, чтобы облегчить обмен данными с кодом, написанным на VB6, а также для облегчения сравнение автомобилей, учитывая три автомобиля X, Y, Z, я могу, например, обнаружить любые изменения между X и Y и применить эти изменения к Z).

Есть ли хороший способ реорганизовать код для использования композиции, а не наследования? Какими свойствами/методами должен обладать объект «Автомобиль», и к каким из них следует обращаться через свойство объекта данных? Следует ли расширять преобразование между автомобилем и объектом сбора? Есть ли какие-либо проблемы при выполнении такого рефакторинга?

ответ

1

Вы можете начать с того, что у автомобиля есть функция (или метод, не уверенная в терминологии vb.net), чтобы получить ее коллекцию - и эта функция первоначально вернет this (или self, или что-то, что называет его vb).

Теперь замените все прямые ссылки на Car-as-Collection на Car.getCollection(), как внутри класса Car, так и снаружи.

Наконец, внесите изменения: создайте переменную-член, инициализируйте ее, верните ее с getCollection() и прекратите наследование из коллекции. Если вы пропустили какие-либо ссылки на шаге 2, они будут отображаться как ошибки компиляции на этом этапе. Исправьте их, и ваш рефакторинг будет завершен.

+0

Замена прямых ссылок на автомобиль как на сборку показалась бы сложной. Возможно, создайте методы заглушки в Car, которые затеняют те из коллекции, переименовывают их с помощью уникального префикса, а затем находят/заменяют этот префикс на «данные»? Это должно успешно преобразовать все неявные ссылки, отличные от тех, которые используют свойство default; я думал, что свойство default можно просто обернуть. Это будет хорошая идея? Большая часть данных, связанных с каждым автомобилем, будет в коллекции, поэтому Car! Color будет казаться более приятным, чем Car.data! Color. Кажется ли это хорошей идеей? – supercat

+0

@supercat, не видя кода, трудно сказать наверняка, но я бы подумал, что преобразование, которое вы предлагаете, будет таким же большим, как и прямое изменение. Тем не менее, если (например) цвет является чем-то особенным для автомобилей, то, на что будут ссылаться часто, это хорошая идея создать методы, которые делают это ясным. Определяя свой API таким образом - «у каждого автомобиля есть цвет» - независимо от того, как он представлен внутри, - вот что такое классный дизайн. –

+0

Идея использования абстрактного объекта коллекции, а не более жестких свойств, заключалась в разрешении абстрактных сравнений между объектами Car. Когда автомобиль «входит в магазин», я клонирую его, чтобы записать его информацию; в следующий раз, когда он появится, я вижу, что изменилось. Новые свойства могут быть добавлены, если логика сравнения не должна знать о них. Коллекция, по сути, не имеет схемы, что несколько нехорошо, но я не знаю, как еще настроить объекты для обмена с VB6 и абстрактными сравнениями. – supercat

Смежные вопросы