Работа с классами c. Работа с классами c.

Другими словами: RenderWindow и RectangleShape не знают, что они взаимодействуют друг с другом, но все равно вызывают правильный метод другого класса!

C#. Класс. Описание класса. Объект класса. Конструктор класса. Деструктор. Ключевое слово this

  • 1. Что такое класс и объект класса ?
  • В чем разница между объявлением класса и объявлением объекта класса?
  • 3) Что объявляется в классе?
  • 4. Что называется полями класса ?
  • 5. Какие элементы языка C# могут относиться к функциям-членам класса?
  • 6. Какая общая форма описания класса?
  • 7. Какие существуют типы (модификаторы) доступа к членам класса?
  • 8. Какие возможности доступа дает использование спаренного модификатора доступа protected internal ?
  • 9. Может ли отсутствовать тип (модификатор) доступа при описании членов класса?
  • 10. Примеры описания простейших классов, содержащих только данные.
  • 11. Как создать объект (экземпляр класса)?
  • 12. К каким типам данных принадлежат классы: к типам значения или к ссылочным типам?
  • 13. Пример описания класса, который содержит данные и методы (функции).
  • 14. Пример использования массива объектов класса и описания деструктора в классе.
  • 15. Какие особенности использования ключевого слова this в классе?
  • 16. Уровни доступности класса в сборке. Пример
  • Связанные темы

Поиск других ресурсов:

1. что такое класс и объект класса?

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

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

В чем разница между объявлением класса и объявлением объекта класса?

При объявлении класса память не выделяется. Форматируется только описание элементов класса.

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

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

3) Что объявляется в классе?

При описании класса объявляются данные, которые он содержит, и программный код, который работает с этими данными.

Класс также может содержать только данные или только программный код. Однако при работе с классами большинство классов содержат как данные, так и программный код.

C# класс данные код рисунок

Общая форма определения класса

Когда вы определяете класс, вы объявляете данные, которые он содержит, и код, который работает с этими данными. В то время как более простые классы могут содержать только код или только данные, большинство реальных классов содержат и то, и другое.

Как правило, данные находятся в элементах данных, определенных классом, а код — в функциях-членах. Следует сразу отметить, что C# предоставляет несколько типов членов данных и функций-членов:

Структура классов в C#

Данные-члены

Члены данных — это те члены, которые содержат данные класса — поля, константы, события. Члены данных могут быть статическими. Член класса является членом экземпляра, если он явно не объявлен как статический. Давайте рассмотрим типы данных:

Поля.

Это все переменные, связанные с классом.

Константы.

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

События

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

Функции-члены

Функции-члены — это члены, которые предоставляют определенные функции для обработки данных класса. К ним относятся методы, свойства, конструкторы, финишеры, функции и указатели:

Методы (Method)

Это функции, связанные с определенным классом. Как и данные-члены, они по умолчанию являются членами экземпляра. Они могут быть объявлены статическими с модификатором static.

Недвижимость

Это наборы функций, доступ к которым клиент может получить так же, как и к публичным полям класса. В C# существует специальный синтаксис для реализации свойств чтения и записи для классов, поэтому нет необходимости писать отдельные методы, имена которых начинаются с Set и Get. Поскольку для свойств не существует отдельного синтаксиса, отличающего их от обычных функций, создается иллюзия, что объекты — это реальные сущности, предоставляемые в клиентском коде.

Продюсер

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

Финалисты.

Они вызываются, когда среда CLR решает, что объект больше не нужен. Они имеют то же имя, что и класс, но перед ними ставится тильда. Невозможно точно предсказать, когда будет вызван финализатор.

Оператор

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

Индексатор.

Позволяет индексировать объекты так же, как таблицы или коллекции.

Класс создается с помощью ключевого слова class. Ниже приведена общая форма определения простого класса, который содержит только переменные и методы:

Имя_классатип_объекта_доступа метод2 (параметр)//. ... Доступ к объекту_типа methodN(parameter).>

Обратите внимание, что доступ указывается перед объявлением каждой переменной и метода. Это спецификатор доступа, например, public, который определяет порядок доступа к определенному члену класса. Члены класса могут быть либо приватными ( private ) внутри класса, либо публичными ( public ), т.е. более легкодоступными. Спецификатор доступа определяет тип разрешенного доступа. Спецификатор доступа указывать не обязательно, но если он отсутствует, объявленный член считается закрытым в классе. Частные члены могут использоваться только другими членами своего класса.

Рассмотрим пример создания класса, описывающего атрибуты пользователя:

using System- using System.Collections.Generic- using System.Linq- using System.Text- namespace ConsoleApplication1.>Программа занятий>>

В этом примере определен новый пользовательский класс UserInfo, который содержит 4 поля и 1 метод, который является публичным (т.е. содержит модификатор public access). В методе Main() создаются два экземпляра этого класса: myInfo и myGirlFriendInfo. Затем поля этих экземпляров инициализируются и вызывается метод writeInConsoleInfo().

Объявление и определение методов

C++ требует, чтобы каждый метод структуры или класса ссылался на определение этой структуры или класса. Однако разрешается написать только объявление метода и разместить определение в другом месте:

// Определение структуры Vec2f содержит // - объявление конструктора // - объявление метода getLength.СтруктураVec2fПоплавокx=0;Поплавокy=0;Vec2f(Поплавокx,Поплавокy);ПоплавокgetLength()const;>;// определение конструктора (добавлено "Vec2f::")Vec2f::Vec2f(Поплавокx,Поплавокy):x(x),y(y)>//определение метода getLength (добавлен спецификатор "Vec2f::")ПоплавокVec2f::getLength()constconstПоплавокквадрат длины=x*x+y*y;возвратstd::sqrt(квадрат длины);>

Классы и структуры

В C++ есть ключевое слово class, которое является почти аналогом struct. Оба ключевых слова обозначают тип данных, и разница между ними только в интерфейсе наследования и инкапсуляции. Других различий между классом и структурой нет.

В C++ можно исключить доступ к полям извне, но сохранить доступ для методов. Для этого мы вводим три вида доступа

  1. public — символ в этой области доступен извне
  2. private — символ из этой области доступен лишь собственных в методах
  3. protected — используется редко, о нём можете прочитать в документации

Давайте сделаем поля типа Vec2f недоступными извне. Также мы заменяем struct на class — это не меняет смысла программы, но считается хорошей формой использовать struct только тогда, когда все поля общедоступны.

КлассVec2fпубличный:// Начало списка публичных методов и полейVec2f(Поплавокx,Поплавокy):x(x),y(y)>ПоплавокgetLength()const// Поля x/y доступны здесь, потому что это внутренний методconstПоплавокквадрат длины=x*x+y*y;возвратstd::sqrt(квадрат длины);>частный://Начинаем список методов и полей, недоступных извнеПоплавокx=0;Поплавокy=0;>;// ! ПЕРЕРЫВ В ТРАНСФОРМАЦИИ! // поля x/y недоступны для внешних операцийнедействительныйprintVector(constVec2f&v)std::cout<""<v.x<","<v.y<"";>

Запомните несколько хороших правил:

  • Используйте struct, если все поля публичные и не зависят друг от друга; используйте class, если между полями должны соблюдаться закономерности (например, поле “площадь” круга должно быть)

Основы наследования

В C++ новый тип может наследовать все поля и методы другого типа. Для этого достаточно указать структуру или класс в списке основных типов. Этот прием используется в SFML при объявлении классов схем:

// ! КОД НАМЕРЕННО УПРОЩЕН!// Класс RectangleShape наследует все поля и методы класса Shape, // но также имеет дополнительные поля и методы. // Окончательный список полей и методов составляется компилятором при создании программы. // Наследование: "Прямоугольник - это фигура".КлассRectangleShape:публичныйФормапубличный:// конструктор, принимающий необязательный аргументRectangleShape(constвектор2f&Размер=вектор2f(0,0));// метод с одним аргументомнедействительныйsetSize(constвектор2f&Размер);// .>;// Класс Shape наследует все поля и методы классов Drawable и Transformable // Смысл наследования: "Фигура - это объект, который можно нарисовать // и для которого можно задать положение/масштаб/вращение".КлассФорма:публичныйРисуемый,публичныйТрансформируемыйпубличный:// Виртуальный измельчитель форм.// Разрушитель называется// 1) для локальной переменной - при выходе из диапазона локальной переменной.// 2) для параметра, переданного в качестве значения - при выходе из функции.// 3) для временных объектов в выражении - после завершения оператора, в котором находится выражение.// 4) для объектов в динамической памяти - когда память освобождается (например, при удалении).// Деструкторы простых типов int, sf::Vector2f и т.д. ничего не делают.// Деструкторы сложных типов освобождают ресурсы (например, удаляют текстуру или вспомогательную память).виртуальный~Форма();// Метод setTexture принимает 2 параметра, 1 из которых необязателен.недействительныйsetTexture(constТекстура*Текстура,boolresetRect=ложный);// .>;

Что означает слово «public» перед именем базового типа? Во-первых, внешний код может передавать RectangleShape в функцию, которая принимает ссылку на Shape, т.е. можно выполнить так называемую модернизацию от низшего (и более конкретного) типа RectangleShape к высшему (и более абстрактному) типу Shape:

// Хотя параметр имеет тип Shape, мы можем передать тип RectangleShape, // потому что RectangleShape - это Shape. // Аналогично, мы можем передать CircleShape.недействительныйdrawShape(sf::RenderWindow&Окно,constФорма&Форма)Окно.Дизайн(Форма);>//Параметр имеет тип RectangleShape и не может быть передан в Shape или CircleShape, //поскольку ни Shape, ни CircleShape не являются RectangleShape.недействительныйdrawRect(sf::RenderWindow&Окно,constRectangleShape&Форма)Окно.Дизайн(Форма);>

Во-вторых, благодаря публичному наследованию все наследуемые поля и методы сохраняют свой уровень доступа: private остается private, public остается public. А если мы наследуем Shape с ключевым словом private, то уровень доступа становится ниже: все методы и поля становятся приватными:

Конструкторы

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

Конструктор по умолчанию

Конструктор по умолчанию не имеет параметров или тела. Если при описании класса вы не создадите свой конструктор, то при создании объекта будет использоваться конструктор по умолчанию. Например, создайте объект здания, используя конструктор по умолчанию. Для этого щелкните левой кнопкой мыши на файле «Program.cs» в браузере решений и напишите следующий код:

using System; namespace FirstClass>>

Здесь мы объявили переменную (объект) типа Building (наш класс) и инициализировали ее с помощью стандартного конструктора. Для создания объекта мы используем ключевое слово new (этот оператор связывает память для нового объекта), а для вызова конструктора ставим скобки после имени класса. После этого переменная building будет содержать ссылку на объект в памяти. Во второй строке мы указали объем нового здания в консоли. А поскольку все переменные типа Real по умолчанию инициализируются 0, при запуске приложения в консоли появится следующая запись.

Собственные конструкторы

В C# вы можете создать любое количество конструкторов для класса. Например, давайте создадим этот конструктор для нашего класса:

Строительный класс>

Обратите внимание, что имя конструктора должно полностью совпадать с именем класса. В остальном конструктор ничем не отличается от методов C#, которые мы уже обсуждали. В нашем конструкторе я использовал ключевое слово this, которое является ссылкой на текущий экземпляр класса. Это ключевое слово можно использовать для разных целей, но в данном случае я использовал его, потому что имена параметров точно соответствуют именам полей класса. Если бы я этого не сделал, компилятор не понял бы, что я хочу сделать (присвоить значение параметра метода полю класса), и предложил бы мне избавиться от лишнего присвоения:

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

Ошибка CS7036 Отсутствует аргумент, соответствующий требуемому формальному параметру «width» в «Building.Building(double, double, double)».

Наш конструктор должен содержать три необходимых параметра, и теперь мы можем создать объект класса следующим образом.

Building Building = new Building(20, 20, 4),

Как и в любом методе C#, мы можем определить необязательные параметры в конструкторе. Например, вот так:

public building(double width, double length, double height = 3).

И теперь следующие два объекта будут полностью идентичны:

static void Main(string args)

Объем второго здания: 1200

Инициализаторы объектов

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

Здание класса

Второй конструктор также использует ключевое слово this, т.е. при создании объекта типа this:

Building Building = new Building(),

наш первый конструктор вызывается с параметрами 20, 20, 3. Теперь давайте посмотрим, как мы можем использовать инициализатор объекта:

Здание Здание = новое здание;

Здесь мы передали значения всем публичным полям класса в круглых скобках и создали объект без явного вызова конструктора. В этом случае необходимо учитывать следующие особенности инициализатора объекта:

  1. используя инициализатор мы можем установить значения только доступных из внешнего кода полей и свойств объекта. Именно поэтому мы добавили к нашим полям модификатор public .
  2. несмотря на то, что явного вызова конструктора не было, конструктор вызывается (в нашем примере был вызван второй конструктор — без параметров) и только после вызова конструктора выполняется инициализатор. Таким образом, мы перезаписали поля нашего объекта в инициализаторе.

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

//мы создаем объект с параметрами width = 20, length = 20, height = 3 и используем инициализатор Building building = new building.; //Создаем объект с параметрами ширина = 20, длина = 20, высота = 3 Здание building2 = new building(); Console.WriteLine($"Объем первого здания: "); Console.WriteLine($"Объем второго здания: "),

Объем второго здания: 1200

Как вы видите, инициализатор объекта перезаписал значения полей, и в консоли появилось значение 6000.

Добавление класса

Обычно классы хранятся в отдельных файлах. Часто для класса существует только один файл. Если мы работаем над проектом вне среды Visual Studio и используем .NET CLI, мы можем просто добавить новый файл класса в папку проекта. Например, добавим новый файл Person.cs, в котором определим следующий код:

Это определяет класс Person с полем name и методом Print.

В файле Program.cs, основном файле проекта, мы используем класс Person:

Person tom = new Person(); tom.name = "Tom"; tom.Print(); // Person Tom

Использование классов в проекте в Visual Studio в языке программирования C#

Visual Studio по умолчанию предоставляет встроенные шаблоны для добавления класса. Чтобы добавить класс, щелкните правой кнопкой мыши на имени проекта в Visual Studio:

В появившемся контекстном меню выберем пункт Add ->New Item. (или Add ->Класс. )

В появившемся окне Добавить новый элемент убедитесь, что элемент Класс выбран в панели Шаблоны основных элементов. В нижней части окна, в поле Name, введите имя нового класса — назовем его Person:

В качестве имени класса можно ввести как Person, так и Person.cs. После нажатия кнопки Add в проект добавляется новый класс, в котором может быть определен тот же код, который используется в файле Program.cs.

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

Классы

Класс — это самый распространенный тип ссылок. Простейшее объявление класса выглядит следующим образом:

Ключевому слову class могут предшествовать атрибуты класса и модификаторы класса: public, internal, abstract, sealed, static, unsafe и partial. Класс не может иметь модификаторы private или protected. За именем класса могут следовать параметры общего типа, базового класса и интерфейсов.

Члены класса могут содержать следующее в квадратных скобках: Методы, свойства, указатели, события, поля, конструкторы, перегруженные операторы, вложенные типы и финализаторы. Члены могут иметь идентификаторы доступа public, internal, private, protected, abstract, sealed, static и partial.

Поля (Fields)

Поле — это переменная, которая является членом класса или структуры.

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

Инициализация поля не требуется. Поля, которым не присвоено значение, получают значение по умолчанию ( 0, \0, null, false ). Инициализация полей начинается до выполнения конструктора, в том порядке, в котором инициализируются поля.

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

Методы (Methods)

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

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

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

Конструкторы

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

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

public Wine ( decimal price, int year ) : this ( price )

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

Наследование (Inheritance)

Класс может наследоваться от другого класса, расширяя или изменяя его. Наследование от класса позволяет повторно использовать его функциональность вместо того, чтобы писать ее с нуля.

Множественное наследование в C# невозможно — класс может наследоваться только от одного класса, но может наследоваться любым количеством классов, образуя иерархию классов.

В этом примере подклассы Stock и House наследуют свойство Name от базового класса Asset. Подклассы также называются производными классами.

Полиморфизм (Polymorphism)

Полиморфизм — буквально с греческого — множество форм. Объекты, переменные и функции являются полиморфными. Это означает, что они могут содержать или обрабатывать значения различных типов. Например, переменная типа X может ссылаться не только на объекты типа X, но и на объекты всех классов, производных от X.

Метод в приведенном примере может передавать не только объекты типа Asset, но и объекты типа Stock и House (так как оба они имеют тип Asset). Полиморфизм основан на предположении, что производные классы (Stock и House) обладают всеми возможностями своего базового класса (Asset), но не наоборот: базовый класс не обладает всеми возможностями производных классов. Если приведенный выше пример переписать так, чтобы метод принимал только тип House, то передать ему объект типа Asset будет невозможно.

Приведение к типу и ссылочное преобразование (Casting and Reference Conversions)

Переменные, которые ссылаются на объект (объектные ссылки), могут:

  • скрыто (автоматически) приводиться к типу базового класса — upcast
  • явно приводиться к типу производного класса — downcast

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

Upcasting

Апкаст создает ссылку базового класса из ссылки производного класса.

После прогноза переменная a относится к тому же фондовому объекту, что и переменная msft. Сам объект трансляции никак не изменяется и не трансформируется:

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

Downcasting

Понижение создает ссылку на производный класс из ссылки на базовый класс.

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

Stock s = ( Stock ) a ; // Ошибка, так как объект не принадлежит классу Stock.

Оператор as

Оператор as выполняет пересылку вниз и возвращает null, если пересылка приводит к ошибке (исключение не выбрасывается).

Stock s = a as stock ; // // // s = null; исключение не возникает.

Оператор as не может выполнять пользовательские преобразования и преобразования чисел.

Структуры (Structs)

Структуры похожи на классы, но имеют два ключевых отличия:

  • структура — значимый тип, класс — ссылочный тип
  • структуры не поддерживают наследования

Структуры могут содержать все члены, доступные в классе, за исключением непараметризованного конструктора, филенализатора и виртуальных членов.

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

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

Структуры имеют скрытый конструктор без параметров, который используется по умолчанию и не может быть переопределен до версии C# 10. Он присваивает нулевые значения всем полям. Начиная с версии 10, язык позволяет задать собственный конструктор без параметров, который обходит поведение встроенного конструктора. В этом случае вы должны явно присвоить значения всем полям.

Инкапсуляция и свойства

Инкапсуляция позволяет скрыть конфиденциальные данные от пользователей. Чтобы достичь этого, вы должны:

  • объявить поля/переменные как private ;
  • обеспечить public get и set методы через свойства для доступа и изменения значения private поля.

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

Свойство представляет собой комбинацию переменной и метода и имеет два метода: get() и set().

Самоучитель по C# для начинающих за 30 минут. Часть 2: ООП и коллекции

Поля можно сделать доступными только для чтения с помощью get() или для чтения и записи с помощью set().

C# позволяет использовать автоматические свойства, где нам не нужно определять поле для свойства и просто писать get; и set; внутри свойства. Измените класс Phone следующим образом:

Самоучитель по C# для начинающих за 30 минут. Часть 2: ООП и коллекции

Результат показывает, что класс Smartphone успешно унаследовал поля и методы от класса Phone.

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

Полиморфизм и перегрузка методов

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

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

Например, базовый класс устройства, имеющий метод enabledScreen(). Производными классами устройств могут быть смартфоны и планшеты, которые также имеют свою собственную реализацию для отображения информации на экране:

Самоучитель по C# для начинающих за 30 минут. Часть 2: ООП и коллекции

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

Абстрактные классы и методы

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

Ключевое слово abstract используется для классов и методов:

  • абстрактный класс – это ограниченный класс, который нельзя использовать для создания объектов (для доступа к нему он должен быть унаследован от другого класса);
  • абстрактный метод: может использоваться только в абстрактном классе и не имеет тела. Тело предоставляется производным классом.

Абстрактный класс может иметь как абстрактные, так и обычные методы. Невозможно создать объекты абстрактного класса. Для создания объектов необходимо использовать класс-потомок.

Давайте рассмотрим пример:

Самоучитель по C# для начинающих за 30 минут. Часть 2: ООП и коллекции

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

Словарь

Класс Dictionary реализует структуру данных Display, иногда называемую Dictionary или Association Array. Идея довольно проста: в обычном массиве мы получаем доступ к данным, используя целочисленный указатель, в то время как словарь использует ключ, который может быть числом, буквенно-цифровым или любым другим типом данных, реализующим метод GetHashCode(). Когда в такую коллекцию добавляется новый объект, для него задается уникальный ключ, который в дальнейшем может быть использован для доступа к нему.

Пустой словарь может быть объявлен следующим образом:

Самоучитель по C# для начинающих за 30 минут. Часть 2: ООП и коллекции

Показано использование основных свойств и методов класса Dictaphone.

На этом мы завершаем вторую часть статьи. Важно понять принципы IPP, а затем правильно применить их на практике.

Оцените статью
Uhistory.ru
Добавить комментарий