Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Разработка Windows Forms > Наследование UserControl


Автор: ProgerIv 2.10.2008, 18:54
Такое дело, есть несколько экземпляров UserControl, каждый из которых содержит функцию одинакового вида (одинаковое описание функций), но содержимое в телах функций может отличаться, надо сделать так, чтобы можно было, не зная какой конкретно экземпляр мы имеем, выполнить ту функцию и получить результат. Догадываюсь что надо делать через интерфейсы, что-то с наследованием, но не представляю как конкретно.

Автор: gojanki 2.10.2008, 19:03
Используй ключевое слово virtual в объявлении метода у базового класса, а в подклассах переписывай с помощью override. Затем через указатель базового класса вызывай этот метод. Это полиморфизм называется.
Либо через интерфейс, реализуешь его во всех своих классах и затем через указатель на интерфейс вызваешь метод.

Код

IMyInterface myInterface = instanceOfYourUserControl;
myInterface.YourMethod();



Автор: diadiavova 3.10.2008, 01:45
Честно говоря не совсем понятно, что надо. Идёт ли речь об экземплярах одного класса, или разных классов, произведённых от одного предка. Реализация будет отличаться. Если речь идёт всё-таки о разных классах, тогда это будет выглядеть так:
Создаётся базовый класс который будет родителем для всех остальных контролов этого семейства, сам он производится  от класса UserControl.Допустим мы создаём абстрактный класс, это позволит нам создать в нём абстрактные методы. В нём создаётся абстрактный метод нужного вида. После этого можно создавать сколько угодно производных классов и в них обязательно надо реализовывать этот метод(в каждом по-своему). Далее можно создавать переменные тип которых будет типом базового класса и передавать им экземпляры производных классов. При вызове вышеозначенного метода, в каждом экземпляре будет работать именно та его реализация, которая была описана в типе, к которому принадлежит данный экземпляр.

Прочитав всё это вряд ли можно что-либо понять. Поэтому прилагаю небольшой проект.

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


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)