Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Модификаторы доступа к компонентам классов в С#.



Классы и объекты в ООП.

Основным понятием ООП является понятие класса.

Класс – множество объектов, связанных общностью структуры и поведения (класс содержит описание структуры и поведение всех объектов, связанных отношением общности). Любой объект является экземпляром класса.

Класс ¾ это определение, план для конструирования экземпляра класса, который является фактически объектом. Класс существует в исходном коде. Объект существует в памяти во время выполнения.

Дантеманн приводит такое сравнение. Класс ¾ это «описание, которое показывает, КАК построить существующую во времени и пространстве переменную этого класса, называемую объектом».

Методом называется процедура или функция, определенная внутри класса.

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

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

На UML-диаграмме класс условно определяется так:

ИмяКласса
- поле1 - поле2
+ метод1() + метод2()


Абстрагирование в ООП.

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

«ручка» - класс

«цвет, толщина линии» - свойства

«провести линию» - действия

Такие группы объектов называются классами объектов. С точки зрения программирования класс – это определяемый пользователем тип, а объект – это экземпляр класса.

Int i1, i2, i3; - объекты класса Int

i1=2; i2=3; i3=i1+i2; - свойства

 

Инкапсуляция в ООП.

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

Здесь можно дать еще одно определение объекта как объединения закрытого набора данных и открытого набора методов (интерфейса) для работы с этими данными.

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



Наследование в ООП.

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

Следует различать отношениями «является»(IS-A) и «содержит» (HAS-A). «IS-A» — это наследование. При отношении «IS-A» объект типа производного класса является также объектом типа базового класса. Все объекты любых классов, открыто порожденных общим базовым классом, могут рассматрив-ся как объекты этого базового класса. «HAS-A» — это композиция. При отношении «HAS-A» объект класса включает один или более объектов др. классов в качестве своих элементов.

 

Полиморфизм в ООП.

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

Стиральная машина (включить, выключить)

Кофеварка (включить, выключить)

 

Описание классов с С#.

В C# класс – пользовательский тип. Для определения класса используется слово class. После него следует имя класса, которое должно быть уникальным в пределах пространства имен (namespace). Требования к именам классов в C# такие же, как и к именам переменных в C/C++. Язык C# регистрозависим (MyClass, myclass – разные имена). Имя класса рекомендуется начинать с заглавной буквы. Если имя класса состоит из нескольких частей, то с большой буквы начинается каждая. Описание класса заключается в операторные скобки. Например,

class SampleClass{…}

После } символ «;» не ставится. Описание класса состоит из описания полей и методов. Каждый из этих компонентов начинается с модификатора области видимости: public, protected, private, internal.



Перечисляемые типы в C#.

Часто бывает удобным создать набор значимых имен, которые будут представлять числовые значения. С#, как и C/C++, предоставляет возможность использовать для этой цели перечисления (enumerations).

enum EmpType

{

Manager, // = О

Grunt,    // = 1

Contractor,  // = 2

VP    // = 3

}

По умолчанию в перечислениях С# первому элементу соответствует числовое значение 0, второму — n+1, третьему — n+2 и т. д. При необходимости можно изменить исходную точку отсчета. Для элементов перечисления вовсе не обязательно использовать строго последовательные числовые значения.

Компилятор попросту подставляет вместо элементов перечисления соответствующие числовые значения. По умолчанию для этих числовых значений компилятор использует тип данных Int. Можно использовать другой тип данных

enum EmpType:byte

{

Manager = 10,    

Grunt = 1,        

Contractor = 100, 

VP = 99              

}

Все перечисления в С# происходят от единого базового класса System. Enum. В этом базовом классе предусмотрены методы для работы с перечислениями.

Статический метод GetUnderlyingType() - позволяет получить информацию о том, какой тип данных используется для представления числовых значений элементов перечисления.

Статический метод GetValues() возвращает экземпляр System. Array, при этом каждому элементу массива будет соответствовать член указанного перечисления.

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

 

Перегрузка операторов в C#.

В С#, как и в любом другом языке программирования, предусмотрен набор специальных символов для выполнения самых распространенных операций с внутренними типами данных. Язык С# (подобно C++ и в противоположность Java) позволяет создавать пользовательские классы и структуры, которые будут реагировать по-своему (как мы определим) на те же самые встроенные операторы, например на оператор сложения «+». Этот прием называется перегрузкой операторов.

Перегруженные операторы — это всего лишь более дружественная по отношению к пользователю класса разновидность открытого метода. Кроме того, не следует забывать о несовместимости этого средства с Common Language Specification. Поэтому при создании пользовательских классов, предназначенных для работы в реальных рабочих приложениях, всегда снабжайте перегруженные операторы обычными методам их аналогами. Можно передавать вызовы от перегруженного оператора обычному методу.

public class Point

{

   public static Point operator + (Point pi. Point p2)

           {return AddPointsCpl. p2);}

   public static Point AddPoints (Point pi, Point p2)

   {return new Pointtpl.x + p2.x. pi. у + p2.y);}

}

 



Абстрактные классы в C#.

Часто при анализе предметной области выясняется, что в классах, объединенных иерархией наследования, можно выделить особенности, общие для всех классов. Например, у каждой фигуры на плоскости можно узнать площадь и периметр и т.д. Для того, чтобы не реализовывать эти особенности для каждого класса в иерархии, это удобно сделать в базовом классе, а после пользоваться этой реализацией в производных классах. При этом может оказаться так, что объекты базового класса не будут соответствовать никаким или процессам реального мира. Если создан класс, объекты которого не могут существовать, то такой класс должен быть описан абстрактным с помощью модификатора abstract. Объекты абстрактных классов не могут быть созданы в программе. Ошибке является одновременное использование модификатора abstract и sealed. Хотя объекты абстрактных классов не могут быть созданы, можно описывать конструкторы абстрактного класса – позже они будут вызываться из потомков. Класс может быть объявлен на любом уровне иерархии.

Абстрактные методы. При реализации потомков программист может забыть добавить свою реализацию, и вся программа будет работать неверно. Для того, чтобы избежать такого рода логических ошибок, в C# было введено понятие абстрактного метода. Эти методы определяются с помощью ключевого слова abstract. Особенности абстрактных методов следующие: 1) могут быть определены только в пределах абстрактного класса; 2)абстрактный метод неявно является виртуальным (virtual); 3) явное объявление абстрактного метода виртуальным является синтаксической ошибкой; 4) к абстрактным методам нельзя применять модификатор static; 5) в С# нельзя определить реализацию абстрактного метода (в отличии от С++, где можно было задать тело чисто виртуального метода); 6) абстрактные методы, как и вирт. не могут быть определены закрытыми (private).

abstract public class Shape

{ abstract public int Area(); }

В абстрактном классе может быть определено любое количество данных и неабстрактных методов.

Св-ва также могут быть абстр. При определении абстр. св-а необходимо указать возможные блоки доступа. В производ. классе можно переопред. только те блоки, которые были заданы в базовом.

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

 



Интерфейсы в С#.

Интерфейс – абстрактный класс, в котором кроме открытых абстрактных методов, свойств и событий, индексаторов нет других компонентов. Интерфейс определяет, что может сделать класс, но он не определяет, как это будет сделано. Для определения интерфейса используется ключевое слово interface.

Public interface IPlayer

{void Play();

Viod Stop();

Void Forward();

}

Интерфейс – ссылочный тип данных. В нем можно определить методы, свойства, индексаторы и события. Каждый компонент интерфейса является неявно абстрактным, модификатор доступа неявно public. Явно все это в интерфейсе не указывается. Имя интерфейса принято начинать с I. Для интерфейсов возможно наследование, синтаксис такой же, как для классов. Но в отличие от классов допустимо множественное наследование.

Public interface IBase1

{void MethodA();}

Public interface IBase2

{void MethodB();}

Public interface IMyInterface: Ibase1, IBase2

{void MethodC();}

От интерфейсов могут наследоваться структуры и классы. Класс, который наследует интерфейс, обязан наследовать все его методы. В реализации методов в классе не следует указывать модификатор override, в отличие от абстрактного класса, абстрактные методы, которые нужно перекрывать с использованием данного модификатора. О такой ситуации, когда класс наследует интерфейс и реализует все его методы, говорят, что класс поддерживает интерфейс. Один класс может наследоваться сразу от нескольких интерфейсов – единственный способ реализации множественного наследования. Класс может наследоваться и от другого класса и интерфейса или интерфейсов. В этом случае первым в списке указывают класс, а затем перечисляют интерфейсы. Порядок следования интерфейсов значения не имеет. Если класс поддерживает какой-либо интерфейс, то он должен поддерживать и все базовые интерфейсы данного. При наследовании класса наследование идет от последнего интерфейса в иерархии, но при этом реализуются и методы всех базовых интерфейсов.



Виды массивов в C#.

Массив – индексированный набор элементов одного типа. В С# индексация начинается с нуля и изменить это нельзя. Для реализации массивов в C# существует класс System.Array. Для него реализована встроенная поддержка.

Тип [] имя_переменной


Int [] a1 = new int [10];

Int [] a2 = {1,2,3};

Int [] a3 = new int[] {1,2,3,4};

Int [] a4 = new int [4] {1,2,3,4};


В первом случае создается массив из заданного количества элементов(10), инициализация значений по умолчанию. Следующие 3 способа абсолютно одинаковы. Массив задается определением его элементов явно. В любом случае длина массива задается при его создании, а не определении. Для указания длины массива обычно используются константы, но это м.б. и переменная или выражение, если не определяется значение его элементов. Возможно создание массивов структур, объектов, классов и интерфейсов. Если не инициализировать элементы массивов ссылочных типов, то каждый элемент будет содержать нулевую ссылку null. Место в куче под каждый элемент требуется выделять отдельно.

Class MyClass

MyClass [] ac = {new MuClass(), newMyClass, newMyClass(2)};

или


MyClass [] ac = new MyClas[3];

Ac [0] = newMyClass();

Ac[1] = newMyClass();

Ac[2]= newMyClass();


Прямоугольные массивы – это массивы с 2 и более измерениями.

Тип [,] имя

Тип [, ,] имя

Int [,] aa5 = new int [3,4];

Int [,] aa6 = {{2,3},{4,5},{6,7}};

Int [,] aa7 = new int [3,2] {{2,3}, {4,5}, {6,7}};

Невыровненные массивы( jagged arrays )-массив массивовневыровненный потому, что сотавляющие его массивы могут иметь различную длину.

Тип [] имя

Int [] [] ja = new int [4] [];

Ja[0] = new int [2];

Ja[1] = new int [4];

Ja[2] = new int [3];

Обращение к неинициализированному элементу массива приводит к возникновению исключения System.NullReferenceException.







Классы и объекты в ООП.

Основным понятием ООП является понятие класса.

Класс – множество объектов, связанных общностью структуры и поведения (класс содержит описание структуры и поведение всех объектов, связанных отношением общности). Любой объект является экземпляром класса.

Класс ¾ это определение, план для конструирования экземпляра класса, который является фактически объектом. Класс существует в исходном коде. Объект существует в памяти во время выполнения.

Дантеманн приводит такое сравнение. Класс ¾ это «описание, которое показывает, КАК построить существующую во времени и пространстве переменную этого класса, называемую объектом».

Методом называется процедура или функция, определенная внутри класса.

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

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

На UML-диаграмме класс условно определяется так:

ИмяКласса
- поле1 - поле2
+ метод1() + метод2()


Абстрагирование в ООП.

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

«ручка» - класс

«цвет, толщина линии» - свойства

«провести линию» - действия

Такие группы объектов называются классами объектов. С точки зрения программирования класс – это определяемый пользователем тип, а объект – это экземпляр класса.

Int i1, i2, i3; - объекты класса Int

i1=2; i2=3; i3=i1+i2; - свойства

 

Инкапсуляция в ООП.

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

Здесь можно дать еще одно определение объекта как объединения закрытого набора данных и открытого набора методов (интерфейса) для работы с этими данными.

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



Наследование в ООП.

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

Следует различать отношениями «является»(IS-A) и «содержит» (HAS-A). «IS-A» — это наследование. При отношении «IS-A» объект типа производного класса является также объектом типа базового класса. Все объекты любых классов, открыто порожденных общим базовым классом, могут рассматрив-ся как объекты этого базового класса. «HAS-A» — это композиция. При отношении «HAS-A» объект класса включает один или более объектов др. классов в качестве своих элементов.

 

Полиморфизм в ООП.

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

Стиральная машина (включить, выключить)

Кофеварка (включить, выключить)

 

Описание классов с С#.

В C# класс – пользовательский тип. Для определения класса используется слово class. После него следует имя класса, которое должно быть уникальным в пределах пространства имен (namespace). Требования к именам классов в C# такие же, как и к именам переменных в C/C++. Язык C# регистрозависим (MyClass, myclass – разные имена). Имя класса рекомендуется начинать с заглавной буквы. Если имя класса состоит из нескольких частей, то с большой буквы начинается каждая. Описание класса заключается в операторные скобки. Например,

class SampleClass{…}

После } символ «;» не ставится. Описание класса состоит из описания полей и методов. Каждый из этих компонентов начинается с модификатора области видимости: public, protected, private, internal.



Модификаторы доступа к компонентам классов в С#.

1) public – обозначает, что компонент доступен отовсюду, в том числе из других классов и сборок;

2) protected – компонент доступен из самого класса, которому принадлежит, и из классов, производных от него;

3) private – компонент доступен из класса, которому он принадлежит;

4) internal (внутренний) – компонент доступен только классам данной сборки.

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

class SampleClass

{

   private int myData = 2;

   public const double pi = 3.1415;

   public int pubData = 3;

}

 

8. Статические компоненты класса в C#

   Без дополнительных объявлений каждый компонент относится к конкретному экземпляру. В С# существует возможность объявлять компоненты, которые будут иметь отношение ко всему классу в целом (ко всем его объектам в равной степени). Такие компоненты называются статическими. Для их объявления используется слово static. Нестатические данные хранятся в своей отдельной области памяти. Т.о. для разных объектов можно присвоить разное значение. Статические данные совместно используются всеми экземплярами класса. Для доступа к статическим данным нужно использовать только имя класса (например, SampleClass). Доступ к статическим данным м.б. осуществлен тогда, когда объект класса не создан.

   Статические методы описываются с помощью static, вызываются через имя класса, а не через имя объекта. Более того, для их вызова необязательно создавать объекты данного класса. Внутри статического метода нельзя получит доступ к нестатическому данному. Наоборот можно:

           Console.Wtiteline(); Int.Parse();


Поделиться:



Последнее изменение этой страницы: 2019-03-22; Просмотров: 359; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.067 с.)
Главная | Случайная страница | Обратная связь