Опубликован: 19.08.2004 | Уровень: для всех | Доступ: платный | ВУЗ: Национальный исследовательский ядерный университет «МИФИ»

Лекция 9: Концепция инкапсуляции и ее реализация в языке C#

< Лекция 8 || Лекция 9: 12 || Лекция 10 >

Особым случаем реализации концепции инкапсуляции в языке объектно-ориентированного программирования C# является механизм полей, предназначенных только для чтения. Для описания такого рода полей в языке C# используется зарезервированное слово readonly .

Основные свойства полей, предназначенных только для чтения, сводятся к следующему. Прежде всего, такие поля необходимо инициализировать непосредственно при описании или в конструкторе класса. Кроме того, значение поля, предназначенного только для чтения, не обязательно должно быть вычислимым в ходе компиляции, а может быть вычислено во время выполнения программы. Наконец, поля, предназначенные только для чтения, занимают предназначенные для них области памяти (что до определенной степени аналогично статическим объектам ).

Проиллюстрируем основные свойства полей, предназначенных только для чтения, следующими примерами фрагментов программ на языке C#. Описание поля выглядит следующим образом:

readonly DateTime date;

Доступ к полю изнутри класса организуется по краткому имени объекта:

... value ... size ... date ...

Доступ к полю из других классов (на примере объекта c как конкретизации класса C ) реализуется с указанием полного имени объекта:

c = new C();
... c.value ... c.size ... c.date ...

Рассмотрим подробнее особенности реализации механизмов доступа к статическим полям и константам в языке программирования C#.

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

Проиллюстрируем это высказывание следующим фрагментом программы на языке C#:

class Rectangle {
    static Color defaultColor;
    //однократно для класса

    static readonly int scale;
    //однократно для класса
    //статические константы 
    //недопустимо использовать

    int x, y, width,height;
    //однократно для объекта 
    ...
}

Как видно из приведенного примера, при описании класса Rectangle со статическими полями Color и scale и динамическими полями x, y, width и height, статическими являются поля, инвариантные по отношению к классу, а динамическими - представляющие собой "неподвижную точку" относительно объекта.

Доступ к статическим полям изнутри класса по краткому имени и из других классов по полному имени соответственно реализуется по аналогии с полями только для чтения:

... defaultColor ... scale ...    
... Rectangle.defaultColor ... 
    Rectangle.scale ...

Продолжим иллюстрацию механизмов реализации концепции инкапсуляции в языке программирования C# следующим примером фрагмента программы:

class C {
    int sum = 0, n = 0;
    public void Add (int x){
        // процедура
        sum = sum + x; n++;
    }
    public float Mean() {
        // функция 
        // (возвращает значение)
        return (float)sum / n;
    }
}

Приведенный пример представляет собой описание класса C, содержащего целочисленные поля sum и n, а также методы Add и Mean для суммирования и вычисления среднего значения, реализованные в форме процедуры и функции, соответственно.

Заметим, что методы Add и Mean класса C описаны как общедоступные и, следовательно, могут быть доступны из любого места программного проекта при указании полного имени, тогда как поля sum и n, в силу умолчаний, принятых в языке программирования C#, являются доступными локально ( private ).

Заметим попутно, что функция (в терминологии языка C#) отличается от процедуры тем, что обязательно возвращает значение. Для определения процедуры, не возвращающей значения, в C# используется зарезервированное слово void.

Проиллюстрируем сказанное об областях видимости объектов языка программирования C# фрагментами программ.

Предположим, что в предыдущем примере, описывающем общедоступный класс C, содержащий целочисленные поля sum и n, а также методы Add и Mean, необходимо организовать доступ к элементам класса изнутри, а также из других классов.

Очевидно, что в силу общедоступности реализации класса C такое задание принципиально осуществимо.

При реализации доступа к элементам класса C изнутри данного класса достаточно указать краткие имена объектов:

this.Add(3);
    float x = Mean();

В то же время, при реализации механизма доступа к элементам класса C из других классов (внешних по отношению к данному) необходимо указывать полные имена объектов:

C c = new C();
    c.Add(3);
    float x = c.Mean();

Манипулирование статическими полями и методами в языке программирования C# осуществляется аналогично рассмотренным выше случаям статических полей и констант.

Например, в случае, если класс, содержащий статические элементы данных, определяется посредством следующего описания:

class Rectangle {
    static Color defaultColor;
    public static void ResetColor(){
        defaultColor = Color.white;
    }
}

доступ к элементам данных изнутри класса осуществляется посредством указания краткого имени объекта класса, например:

ResetColor();

а доступ к элементам данных из других классов - посредством указания полного имени объекта класса, например:

Rectangle.ResetColor();

По результатам исследования концепции инкапсуляции и ее применения в языках объектно-ориентированного программирования можно сделать следующие выводы о принципиальных преимуществах рассмотренной концепции.

Прежде всего, реализация концепции инкапсуляции приводит к унификации представления, а следовательно, и моделирования сколь угодно сложных предметных областей.

Кроме того, механизм инкапсуляции обеспечивает четкий, недвусмысленный, прямолинейный подход к моделированию предметной области за счет объединения объектов с данными.

Именно в силу последнего обстоятельства становится принципиально возможной реализация гибкого управления уровнем абстракции как для данных, так и для метаданных.

Наконец, концепция инкапсуляции гарантирует более высокую степень безопасности результирующего кода и его защищенности от несанкционированных действий или случайных ошибок пользователя.

Для более подробного самостоятельного ознакомления с тематикой лекции рекомендуется следующий список источников: [ 23, 34, 53, 63, 75].

< Лекция 8 || Лекция 9: 12 || Лекция 10 >