Интерфейс Icomponent и класc Component
Класс Component наследует класс MarshalByRefObject, который используется в том случае, когда компонент создается вне локальной среды, например в другом процессе или на другом компьютере, связанном с первым по сети. Для обмена данными (аргументами методов и возвращаемыми значениями) должен существовать механизм, который определит способ пересылки данных. По умолчанию принимается, что информация… Читать ещё >
Интерфейс Icomponent и класc Component (реферат, курсовая, диплом, контрольная)
Благодаря особенностям работы средств языка С#, любой его класс полностью соответствует общему определению компонента. Например, будучи скомпилированным, класс (в его двоичной форме) можно использовать в различных приложениях. Но значит ли это, что любой класс является компонентом? Ответ: нет. Для того чтобы класс стал компонентом, он должен следовать компонентной модели, определенной средой .NET Framework. К счастью, этого совсем не трудно добиться: такой класс должен реализовать интерфейс System.ComponentModel.Icomponent. При реализации интерфейса Icomponent компонент удовлетворяет набору правил, позволяющих компоненту быть совместимым со средой. Framework.
Несмотря на простоту реализации интерфейса Icomponent, во многих ситуациях лучше использовать альтернативный вариант — класс System.ComponentModel.Component. Класс Component обеспечивает стандартную реализацию интерфейса Icomponent. Он также поддерживает другие полезные средства, свойственные компонентам. Опыт показывает, что большинству создателей компонентов удобнее выводить их из класса Component, чем самим реализовать интерфейс Icomponent, поскольку в первом случае нужно попросту меньше программировать. Следовательно, в С# на создание компонента не требуется «героических усилий» со стороны программиста.
Интерфейс Icomponent определяет правило, которому должны следовать все компоненты. В интерфейсе Icomponent определено только одно свойство и одно событие. Вот как объявляется свойство Site:
Isite Site{ get; set; }.
Свойство Site получает или устанавливает узел компонента. Узел идентифицирует компонент. Это свойство имеет null-значение, если компонент не хранится в контейнере. Событие, определенное в интерфейсе Icomponent, носит имя Disposed и объявляется так:
event EventHandler Disposed.
Клиент, которому нужно получить уведомление при разрушении компонента, регистрирует обработчик событий посредством события Disposed. Интерфейс Icomponent также наследует интерфейс System. Idisposable, в котором определен методDispose ():
void Dispose ().
Этот метод освобождает ресурсы, используемые объектом. Несмотря на то что для создания компонента достаточно реализовать интерфейс Icomponent, намного проще создать класс, производный от класса Component, поскольку он реализует интерфейс Icomponent по умолчанию. Если класс наследует класс Component, значит, он автоматически выполняет правила, необходимые для получения. NETсовместимого компонента.
В классе Component определен конструктор только по умолчанию. Обычно программисты не создают объект класса Component напрямую, поскольку основное назначение этого класса — быть базовым для создаваемых компонентов. В классе Component определено два открытых свойства. Объявление первого из них, свойства Container, такое:
public Icontainer Container {get; }.
Свойство Container возвращает контейнер, который содержит вызывающий компонент. Если компонента нет в контейнере, возвращается значение null. Следует помнить, что свойство Container устанавливается не компонентом, а контейнером. Второе свойство, Site, определено в интерфейсе Icomponent. В классе Component оно реализовано как виртуальное:
public virtual Isite Site{ get; set; }.
Свойство Site возвращает или устанавливает объект типа Isite, связанный с компонентом. Оно возвращает значение пи11, если компонента в контейнере нет. Свойство Site устанавливается не компонентом, а контейнером. В классе Component определено два открытых метода. Первый представляет собой переопределеие метода ToString (). Второй, метод Dispose (), используется в двух формах. Первая из них такова:
public void Dispose ();
Метод Dispose (), вызванный в первой форме, освобождает любые ресурсы, используемые вызывающим компонентом. Этот метод реализует метод Dispose (), определенный в интерфейсе System.Idisposable. Для освобождения компонента и занимаемых им ресурсов клиент вызывает именно эту версию метода Dispose (). Вот как выглядит вторая форма метода Dispose ():
protected virtual public void Dispose (bool how);
Если параметр how имеет значение true, эта версия метода освобождает как управляемые, так и неуправляемые ресурсы, используемые вызывающим объектом. Если how равно значению false, освобождаются только неуправляемые ресурсы. Поскольку эта версия метода Dispose () защищена (protected), ее нельзя вызвать из кода клиента. Поэтому клиент использует первую версию. Другими словами, вызов первой версии метода Dispose () генерирует обращение к методу Dispose (bool how). В общем случае компонент, в котором больше нет необходимости, переопределяет версию Dispose (bool how), если он содержит ресурсы, которые нужно освободить. Если компонент не занимает никаких ресурсов, то для его освобождения достаточно стандартной реализации метода Dispose (bool how), определенной в классе Component.
Класс Component наследует класс MarshalByRefObject, который используется в том случае, когда компонент создается вне локальной среды, например в другом процессе или на другом компьютере, связанном с первым по сети. Для обмена данными (аргументами методов и возвращаемыми значениями) должен существовать механизм, который определит способ пересылки данных. По умолчанию принимается, что информация должна передаваться по значению, но при унаследовании класса MarshalByRefObject данные будут передаваться по ссылке. Таким образом, С#-компонент обеспечивает передачу данных по ссылке.