как правельно перегрузить класс.

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

Ответить
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

как правельно перегрузить класс.

Сообщение Attid »

у меня программа работает с компортами(основывается на синасере), есть класик. который имеет Х свойств и методов.

сейчас мне нужен такой же классик который работает по сети а позже потребуется и по ЮЗБ. методы у них будет примерно одинаковы , ну свойства соотрветсвенно немного разные.

вопрос как это правельно организовать ?

что я вижу.

1, создать подобный класс с другими названиями, и в задаче по условию использовать тот или другой класс. (есть подозрение что много прийдется переделывать в готовом коде. хотя может и нет.)

2, наследоваться от общего родителя. наверно самый правильный вариант , но там у меня уже предок блоксерал, в сетевом будет блоксокет, а что будет в юзб даже не знаю еще. и как это обьеденить не очень понимаю.

3, в классе перегрузить конструкторы создания , а в остальных методах смотреть условия создания и отрабатывать по своему. (минус классик будет жирный, что может увеличить кол-во ошибок и усложнить отладку.)


хочется услышать советы знатоков.
wavebvg
постоялец
Сообщения: 355
Зарегистрирован: 28.02.2008 03:57:35

Сообщение wavebvg »

Виртуальные свойства класса помогут создать шаблон, к которому можно прикрутить всё и вся.
В общем-то, если понимать, что любое свойство класса (то бишь процедура или функция) - это всего-лишь адрес начала процедуры, то в ходе работы всегда можно их связать по своему успотрению, главное знать, этот самый адресс.

ЗЫ Объяснил как-то на пальцах, поскольку сам созданием НОРМАЛЬНЫХ КЛАССОВ никогда не занимался
ЗЫ2 Для решения подобных задач стоит применять UML моделирование - очень помогает при поталогическом склерозе (это я про себя)
Аватара пользователя
Sergei I. Gorelkin
энтузиаст
Сообщения: 1409
Зарегистрирован: 24.07.2005 14:40:41
Откуда: Зеленоград

Сообщение Sergei I. Gorelkin »

Сначала определи интерфейс - те методы, которые будут вызываться извне. Затем два варианта:
1) Этот интерфейс оставить интерфейсом и написать три класса-адаптера, которые будут его реализовывать. При таком подходе можно первый адаптер отнаследовать прямо от блоксериала, второй от блоксокета, третий - от usb класса.
2) Оформить интерфейс в виде класса с виртуальными методами, от него отнаследовать три класса-адаптера. В каждом из них будет поле, содержащее в первом случае блоксокет, во втором -.......
Второй подход имеет то преимущество, что если в какой-то момент обнаружится, что три адаптера делают одно и то же, эту функциональность легко перенести в базовый класс в одном экземпляре. Кроме того, второй подход нисколько не мешает реализовать в базовом классе некий интерфейс.
Аватара пользователя
alexs
долгожитель
Сообщения: 4066
Зарегистрирован: 15.05.2005 23:17:07
Откуда: г.Ставрополь
Контактная информация:

Сообщение alexs »

Sergei I. Gorelkin
Хорошо расписал. Мне тоже кажется, что 2-й вариант лучше. Интерфейсы вещь конечно хорошая - но обычные классы - гибче.
Аватара пользователя
Attid
долгожитель
Сообщения: 2588
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

alexs писал(а):Мне тоже кажется, что 2-й вариант лучше.

вот не нам пожалуй и остановлюсь =)


Sergei I. Gorelkin благодарю.
PublicJoke
новенький
Сообщения: 41
Зарегистрирован: 04.07.2006 12:21:07

Сообщение PublicJoke »

Если интересует, могу поделиться готовым. Но предупреждаю - документации нет, тестов минимум, гарантий никаких, неотделимо от собственной библиотеки.
Ответить