Что такое объект класса
Доброго времени суток! Настало время поговорить о таких понятиях как класс и объект в контексте объектно-ориентированного программирования и языка C#. На самом деле, мы уже не раз сталкивались с классами и объектами, тот же метод «Main» (в котором мы пишем практически весь код) принадлежит классу «Program».
Можно сказать, что класс – это описание какого-то типа данных. Это некий абстрактный шаблон (набор правил), по которому мы можем создавать объекты (переменные, того типа данных, который описывает класс). Объект – это созданный экземпляр класса. Например, есть класс «Студент», который характеризует среднестатистического студента (с фамилией, именем, возрастом и т.п.), а есть конкретный студент Иванов Иван 20-ти лет. Вот в данном случае, Иванов Иван 20-ти лет как раз и является экземпляром класса! Т.е. конкретно существующей сущностью. Или другой пример, форма для выпечки хлеба является своего рода «классом», а выпеченные в ней булки хлеба – экземплярами. А теперь разберемся как создавать классы.
Хотя, на практике, Вам чаще придется работать с объектами классов, который создали не Вы (например, с объектами стандартных классов)…
И так, вот самый простой пример создания класса:
//Класс, описывающий простого студента class Student < //Тело класса >
В данном примере создан самый простой класса с именем «Student», это вообще пустой класс, но даже такой класс может быть полезен на практике! Так по каким же правилам создаются классы? В самом простом случае указывается ключевое слово class после которого, через пробел, указывается название класса (в нашем случае «Student»). После названия класса, в фигурных скобках идет тело класса. А теперь давайте посмотрим, как можно создать объекты класса «Student»:
Student firstStudent = new Student();
Объекты классов, создаются почти так же, как и переменные стандартных типов, только после знака «=» мы используем ключевое слово new и дальше снова повторяем имя класса с круглыми скобками после него.
Очень похоже на вызов метода. Позже Вы поймете почему так!
Но на практике от такого «студента» толка будет мало, так как наш класс пустой… Так что, давайте заполним тело класса полезным содержимым! В этом уроке мы рассмотрим, как «заполнять» тело класса полями и методами.
Сначала разберемся с полями класса. Создаются они практически так же, как мы создавали переменные в методах, только есть одно отличие, перед полем класса желательно указать уровень доступа к нему. А указывается он с помощью одного из ключевых слов (модификаторов доступа), таких как public (доступ открыт) и private (доступ закрыт).
В C# есть еще и другие модификаторы доступа, но на данном этапе они нам пока не нужны.
Так вот, давайте заполним наш пустой класс несколькими полями, чтобы посмотреть на практике, как это делается:
//Класс, описывающий простого студента class Student < //Тело класса public string name; //Имя студента public uint grade; //Курс >
Выглядеть это может примерно так. В данном случае мы добавили два открытых поля (одно строковое, обозначающее имя, а второе целочисленное, неотрицательное, обозначающее курс). И с такими «студентами» уже можно работать. Давайте создадим студента Ивана, второго курса обучения:
//Создаем объект-студента (пока "безликого") Student ivanStudent = new Student(); //Задаем значения полей объекта ivanStudent.name = "Иван"; //Задаем имя ivanStudent.grade = 2; //Задаем курс
Всю работу мы сделали в два этапа, сначала создали «безликого» студента (создали новый объект класса), а потом задали значения полям объекта.
Обратите внимание как мы получаем доступ к полям объекта, сначала мы указываем имя объекта, а затем, через точку – имя поля. Обращение к методам и свойствам осуществляется так же.
В данном случае, мы можем устанавливать значения полям объекта что называется в лоб, т.е. напрямую обращаясь к ним после создания объекта. Такая возможность осталась у нас по тому, что при создании полей во время написания класса мы указали ключевое слово public перед каждым полем.
Но на практике так лучше не делать. Как правило, поля классов делают закрытыми, чтобы пользователь класса не мог работать с ними на прямую. Потому, что каждый объект – это сложная система, которая «живет» по своим правилам, и некорректное вмешательство из вне, может привести к нарушению целостности!
Если бы мы объявили поля класса закрытыми, т.е. вместо слова public написали слово private, то подобного рода код, просто не компилировался:
//Задаем значения полей объекта ivanStudent.name = "Иван"; //Задаем имя ivanStudent.grade = 2; //Задаем курс
Но как же тогда работать с объектами, как задавать значения их полям, как получать эти значения? Вот тут нам и пригодятся методы! Общая практика предлагает делать поля класса закрытыми, а вот методы (а точнее часть методов) – открытыми, и уже с их помощью задавать и получать значения полей.
Внутри методов класса (как открытых, так и закрытых), можно получить доступ к любому, даже самому закрытому полю класса!
В чем преимущество данного подхода? Да в том, что класс пишете Вы, и Вы как его разработчик лучше всех знаете, что разрешить пользователю класса, а что запретить, и в соответствии с этим, разрабатываете открытые методы класса. А уже используя эти методы, пользователь класса и будет манипулировать объектами.
Так что, давайте изменим код класса, сделаем закрытыми его поля и создадим по два открытых метода, на каждое поле, один будет задавать значение полю, а второй – возвращать.
//Класс, описывающий простого студента class Student < //Возвращает значение поля name public string GetName() < return name; >//Возвращает значение поля grade public uint GetGrade() < return grade; >//Устанавливает значение поля name public void SetName(string aName) < name = aName; >//Устанавливает значение поля grade public void SetGrade(uint aGrade) < grade = aGrade; >//Тело класса private string name; //Имя студента private uint grade; //Курс >
Теперь, задать значения полям объекта можно только так:
//Создаем объект-студента (пока "безликого") Student ivanStudent = new Student(); //Задаем значения полей объекта ivanStudent.SetName("Иван"); //Задаем имя ivanStudent.SetGrade(2); //Задаем курс
На самом деле, в нашем случае, методы, устанавливающие значения полям, не особо отличаются функциональностью, но на практике, часто такие методы могут быть оснащены дополнительными проверками аргументов, например, методы могли бы не устанавливать слишком длинные имена, или курс старше шестого…
На сегодня, наверное, хватит информации. В этом уроке, мы обсудили понятия класса, объекта, полей и методов, а в следующем уроке мы поговорим про свойства в классах.
Чем отличается экземпляр класса от объекта класса?
Чем отличается экземпляр класса от объекта класса в objective-c? Задали такой вопрос на собеседовании, я в недоумении ответил «Не понимаю вопроса, разве это не одно и то же?». Просьба сильно не пинать, обж-си учил сам, в ускоренном темпе, и времени разбираться с самой концепцией не было.
Отслеживать
4,508 21 21 серебряный знак 29 29 бронзовых знаков
задан 30 янв 2011 в 11:31
AlexDenisov AlexDenisov
6,452 1 1 золотой знак 20 20 серебряных знаков 29 29 бронзовых знаков
5 ответов 5
Сортировка: Сброс на вариант по умолчанию
Я думаю, Вы попали под раздачу из-за недостаточной квалификации собеседующего… если заниматься прямым переводом терминов, то можно много интересного узнать :).
В документации по Obj-C используются термины class object и class instance . Если их дословно перевести на русский, то получится как раз то, о чём Вас спрашивали. Причём в русском языке естественно объект класса считать его экземпляром . В то время, как совершено очевидно, что означает английский термин class object — этот объект, в котором хранится, так сказать, информация о классе.
Class Objects
- The name of the class and its superclass
- A template describing a set of instance variables
- The declarations of method names and their return and argument types
- The method implementations
Классы, структуры и пространства имен
C# является полноценным объектно-ориентированным языком. Это значит, что программу на C# можно представить в виде взаимосвязанных взаимодействующих между собой объектов.
Описанием объекта является класс , а объект представляет экземпляр этого класса. Можно еще провести следующую аналогию. У нас у всех есть некоторое представление о человеке, у которого есть имя, возраст, какие-то другие характеристики. То есть некоторый шаблон — этот шаблон можно назвать классом. Конкретное воплощение этого шаблона может отличаться, например, одни люди имеют одно имя, другие — другое имя. И реально существующий человек (фактически экземпляр данного класса) будет представлять объект этого класса.
В принципе ранее уже использовались классы. Например, тип string , который представляет строку, фактически является классом. Или, например, класс Console , у которого метод WriteLine() выводит на консоль некоторую информацию. Теперь же посмотрим, как мы можем определять свои собственные классы.
По сути класс представляет новый тип, который определяется пользователем. Класс определяется с помощью ключевого слова сlass :
class название_класса < // содержимое класса >
После слова class идет имя класса и далее в фигурных скобках идет собственно содержимое класса. Например, определим в файле Program.cs класс Person, который будет представлять человека:
class Person
Однако такой класс не особо показателен, поэтому добавим в него некоторую функциональность.
Поля и методы класса
Класс может хранить некоторые данные. Для хранения данных в классе применяются поля . По сути поля класса — это переменные, определенные на уровне класса.
Кроме того, класс может определять некоторое поведение или выполняемые действия. Для определения поведения в классе применяются методы.
Итак, добавим в класс Person поля и методы:
class Person < public string name = "Undefined"; // имя public int age; // возраст public void Print() < Console.WriteLine($"Имя: Возраст: "); > >
В данном случае в классе Person определено поле name , которое хранит имя, и поле age , которое хранит возраст человека. В отличие от переменных, определенных в методах, поля класса могут иметь модификаторы, которые указываются перед полем. Так, в данном случае, чтобы все поля были доступны вне класса Person поля определены с модификатором public .
При определении полей мы можем присвоить им некоторые значения, как в примере выше в случае переменной name . Если поля класса не инициализированы, то они получают значения по умолчанию. Для переменных числовых типов это число 0.
Также в классе Person определен метод Print() . Методы класса имеют доступ к его поля, и в данном случае обращаемся к полям класса name и age для вывода их значения на консоль. И чтобы этот метод был виден вне класса, он также определен с модификатором public .
Создание объекта класса
После определения класса мы можем создавать его объекты. Для создания объекта применяются конструкторы . По сути конструкторы представляют специальные методы, которые называются так же как и класс, и которые вызываются при создании нового объекта класса и выполняют инициализацию объекта. Общий синтаксис вызова конструктора:
new конструктор_класса(параметры_конструктора);
Сначала идет оператор new , который выделяет память для объекта, а после него идет вызов конструктора .
Конструктор по умолчанию
Если в классе не определено ни одного конструктора (как в случае с нашим классом Person), то для этого класса автоматически создается пустой конструктор по умолчанию, который не принимает никаких параметров.
Теперь создадим объект класса Person:
Person tom = new Person(); // создание объекта класса Person // определение класса Person class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >
Для создания объекта Person используется выражение new Person() . В итоге после выполнения данного выражения в памяти будет выделен участок, где будут храниться все данные объекта Person. А переменная tom получит ссылку на созданный объект, и через эту переменную мы можем использовать данный объект и обращаться к его функциональности.
Обращение к функциональности класса
Для обращения к функциональности класса — полям, методам (а также другим элементам класса) применяется точечная нотация точки — после объекта класса ставится точка, а затем элемент класса:
объект.поле_класса объект.метод_класса(параметры_метода)
Например, обратимся к полям и методам объекта Person:
Person tom = new Person(); // создание объекта класса Person // Получаем значение полей в переменные string personName = tom.name; int personAge = tom.age; Console.WriteLine($"Имя: Возраст "); // Имя: Undefined Возраст: 0 // устанавливаем новые значения полей tom.name = "Tom"; tom.age = 37; // обращаемся к методу Print tom.Print(); // Имя: Tom Возраст: 37 class Person < public string name = "Undefined"; public int age; public void Print() < Console.WriteLine($"Имя: Возраст: "); > >
Консольный вывод данной программы:
Имя: Undefined Возраст: 0 Имя: Tom Возраст: 37
Добавление класса
Обычно классы помещаются в отдельные файлы. Нередко для одного класса предназначен один файл. Если мы работаем над проектом вне среды Visual Studio, используя .NET CLI, то нам достаточно добавить новый файл класса в папку проекта. Например, добавим новый файл, который назовем Person.cs и в котором определим следующий код:
class Person < public string name = "Undefined"; public void Print() < Console.WriteLine($"Person "); > >
Здесь определен класс Person с одним полем name и методом Print.
В файле Program.cs , который представляет основной файл программы используем класс Person:
Person tom = new Person(); tom.name = "Tom"; tom.Print(); // Person Tom
Visual Studio предоставляет по умолчанию встроенные шаблоны для добвления класса. Для добавления класса нажмем в Visual Studio правой кнопкой мыши на название проекта:
В появившемся контекстном меню выберем пункт Add -> New Item. (или Add -> Class. )
В открывшемся окне добавления нового элемента убедимся, что в центральной части с шаблонами элементов у нас выбран пункт Class . А внизу окна в поле Name введем название добавляемого класса — пусть он будет назваться Person :
В качестве названия класса можно вводить как Person, так и Person.cs. И после нажатия на кнопку добавления в проект будет добавлен новый класс, в котором можно определить тот же код и также использовать в файле Program.cs.
Таким образом, мы можем определять классы в отдельных файлах и использовать их в программе.
Что такое объекты и классы: 1‑я часть гайда по ООП
Почти всё современное программирование построено на принципах ООП, поэтому их должен понимать каждый разработчик. Узнайте основы из этой статьи.
Фото: Sonja Flemming / NBCUniversal / Getty Images
Евгений Кучерявый
Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.
Это первая статья из серии, посвящённой объектно-ориентированному программированию. Она предназначена для тех, кто хочет понять суть этой парадигмы разработки, а не просто научиться использовать классы и объекты.
Цикл состоит из статей, посвящённых различным аспектам ООП:
- что такое классы и объекты;
- особенности работы с объектами;
- модификаторы доступа, инкапсуляция;
- перегрузка методов;
- полиморфизм;
- наследование и ещё немного полиморфизма;
- абстрактные классы и интерфейсы;
- практикум.
Все примеры в этой серии написаны на языке C#. Для наглядности они будут связаны с разработкой игр, потому что именно в играх (хотя далеко не только в них) активно используются объекты.
Перед тем как приступать к изучению ООП, убедитесь, что знакомы со следующими понятиями:
- переменные и типы данных,
- условные конструкции,
- циклы,
- коллекции (желательно).
Работа будет проходить в Visual Studio 2019, но вполне подойдёт и VS 2017.
В конце каждой статьи будут задания, которые помогут закрепить тему. Выполнять их необязательно, но имейте в виду, что осилить ООП без практики просто невозможно. Если же вам лень выполнять задания, можете просто посмотреть наш вариант решения. Итак, поехали!
Введение в объектно-ориентированное программирование:
- Что такое ООП
- Какие у него плюсы и минусы
- Что такое абстракция, инкапсуляция, наследование и полиморфизм
- Объекты и классы: как их использовать
- Как создать класс
- Как использовать поля и свойства класса
- Как создать метод
- Что такое конструктор объекта
- Домашнее задание
- Что запомнить
Что такое ООП
Объектно-ориентированное программирование (сокращённо ООП) — это парадигма разработки программного обеспечения, согласно которой приложения состоят из объектов.
На объектах и классах строится всё ООП. Поэтому давайте чётко обозначим, чем они отличаются друг от друга.
Класс — это тип данных, созданный пользователем. Он содержит разные свойства и методы, как, например, тип String или Int.
Объект — это экземпляр класса, или его копия, которая находится в памяти компьютера. Например, когда вы создаёте переменную типа String и присваиваете ей значение «Строка», то в памяти создаётся экземпляр класса String.
По-другому можно сказать, что объекты — это сущности, у которых есть свойства и поведение. Обычно объекты являются экземплярами какого-нибудь класса. Например, в игре может быть класс Character («Персонаж»), а его экземплярами будут hero или npc.
Свойства — это данные, которые связаны с конкретным объектом:
- здоровье,
- очки,
- деньги,
- сила,
- ловкость,
- интеллект,
- скорость,
- координаты.
Поведение объекта определяется с помощью методов — специальных блоков кода, которые можно вызывать из разных частей программы. Например, у того же объекта Character могут быть следующие методы:
- идти,
- атаковать,
- говорить,
- подобрать,
- выбросить,
- использовать.
Используя эти свойства и методы, можно значительно ускорить разработку, сделать код более читаемым. К тому же самому программисту проще составлять код, если он думает с помощью объектов.
Разработчики не пишут какую-то функцию, которая будет делать что-то для программы в целом. Вместо этого они мысленно разделяют приложение на отдельные компоненты и продумывают их свойства и поведение.
Такую парадигму используют многие популярные языки:
- C#,
- Java,
- Python,
- JavaScript,
- PHP,
- Kotlin,
- Swift,
- Objective-C,
- C++.
У нас также есть статья по ООП на Python. Поэтому если вы не любите C#, то можете изучить главные принципы на Python.
Плюсы и минусы объектно-ориентированного программирования
Плюсы | Минусы |
---|---|
Легко читается. Не нужно выискивать в коде функции и выяснять, за что они отвечают | Потребляет больше памяти. Объекты потребляют больше оперативной памяти, чем примитивные типы данных |
Быстро пишется. Можно быстро создать сущности, с которыми должна работать программа | Снижает производительность. Многие вещи технически реализованы иначе, поэтому они используют больше ресурсов |
Проще реализовать большой набор функций. Так как на написание кода уходит меньше времени, можно гораздо быстрее создать приложение с множеством возможностей | Сложно начать. Парадигма ООП сложнее функционального программирования, поэтому на старт уходит больше времени |
Меньше повторений. Не нужно писать однотипные функции для разных сущностей | |
Основные принципы объектно-ориентированного программирования
Всё объектно-ориентированное программирование строится на четырёх понятиях:
Чтобы стало понятнее, представим, что у нас есть класс «Кошка». В нём присутствуют несколько атрибутов — например, «окрас», «порода» и «возраст», а также методов — например, «спать». И когда у нас есть класс, мы можем создать сколько угодно его экземпляров с разными свойствами. Например, мы можем добавить несколько пород кошек:
Теперь перейдём к принципам ООП.
Абстракция
При создании класса мы упрощаем его до тех атрибутов и методов, которые нужны в этом конкретном коде, не пытаясь описать его целиком и отбрасывая всё второстепенное. Скажем, все кошки теоретически умеют охотиться, но если наша программа не предназначена для ловли мышей, то и прописывать этот метод незачем.
Подробно об абстракции и абстрактных классах в ООП можно прочитать в другой нашей статье.
Инкапсуляция
Доступ к данным объекта должен контролироваться, чтобы пользователь не мог изменить их в произвольном порядке и что-то поломать. Поэтому для работы с данными программисты пишут публичные методы, которые составляют интерфейс объекта.
Возвращаясь к нашим кошечкам. Мы можем разрешить изменять атрибут «возраст», но только в большую сторону (к сожалению, с годами никто не молодеет), а атрибут «порода» лучше открыть только для чтения — ведь порода кошки не меняется.
Подробно об инкапсуляции с примерами кода читайте в гайде Skillbox Media.
Наследование
Классы могут передавать свои атрибуты и методы классам-потомкам. Например, мы хотим создать новый класс «Домашняя кошка». Он практически идентичен классу «Кошка», но у него появляются новые атрибуты — «хозяин» и «кличка», а также метод «клянчить вкусняшку». Достаточно объявить «Домашнюю кошку» наследником «Кошки» и прописать новые атрибуты и методы — вся остальная функциональность перейдёт от родителя к потомку.
Больше о наследовании, с примерами кода и полезными практическими советами, читайте в статье «Наследование и ещё немного полиморфизма: 6-я часть гайда по ООП».
Полиморфизм
Этот принцип позволяет применять одни и те же команды к объектам разных классов, даже если они выполняются по-разному. Например, помимо класса «Кошка», у нас есть никак не связанный с ним класс «Попугай» — и у обоих есть метод «спать». Несмотря на то, что кошки и попугаи спят по-разному (кошка сворачивается клубком, а попугай сидит на жёрдочке), для этих действий можно использовать одну команду.
Объекты и классы: как их использовать
Классами в C# является практически всё — строки, числа, массивы и так далее. У каждого из них есть свой набор свойств (например, количество символов в строке или размер типа данных), а также методы, которые позволяют удобно работать с объектами класса (например, отсортировать массив или сложить два числа).
На основе «базовых» классов из C#, мы можем создавать свои. К примеру, возьмём числа типа Int64 и создадим с помощью них числа с плавающей точкой. Такой класс, конечно, уже есть, но мы можем переопределить его по-своему.
Изучая C#, разработчик в первый же день сталкивается с классами и объектами. Например, вот как выглядит первая программа любого новичка:
Как создать класс
Чтобы создать класс, откройте в Visual Studio меню Project и выберите пункт Add Class…:
Затем введите его название и нажмите Add:
Программа создаст отдельный файл с таким кодом:
Если доступ к полям открыт, то с ними можно проводить вычисления или просто получать их значения. Если же нужно запретить доступ к определённым полям — используйте свойства.
Это специальные конструкции, которые позволяют обращаться к полям. Чтобы создать свойства, нужно сначала закрыть доступ к полям с помощью уровня доступа private — тогда они будут доступны только изнутри класса:
Как создать метод
Теперь можно приступить к работе с поведением объектов. Оно реализуется с помощью методов — специальных блоков кода, которые позволяют избежать повторений в проекте.
Методы являются аналогами функций (возвращают значение) и процедур (не возвращают), но с той разницей, что они являются частью какого-то класса. Например, можно в классе Character создать метод Move(), который будет отвечать за движение персонажа.
Если же нужно, чтобы метод что-то возвращал, то указывается его тип и используется оператор return:
Конструктор объекта
В примере выше объект создаётся с уже заданными значениями, но есть возможность указывать свои параметры. Для этого используются конструкторы — специальные методы, которые запускаются при инстанцировании экземпляра класса. С их помощью можно передать объекту параметры и провести необходимые операции.
Вот пример того же класса с конструктором:
Домашнее задание
Создайте консольную игру, в которой игрок сможет управлять персонажем с помощью команд. Возможности, которые должны быть в игре:
- перемещение;
- атака;
- получение опыта за победу над врагами;
- повышение уровня и здоровья персонажа.
Что запомнить
Это лишь вступление в ООП, и ещё многое предстоит изучить, чтобы начать применять его в полную силу. Например, нужно понять, как технически работают классы, как они хранятся в памяти, почему их называют ссылочными типами и так далее.
ООП — сложная, но эффективная парадигма программирования. Её стоит знать всем, кто хочет создавать программы и найти работу, потому что почти все популярные языки её поддерживают. И несмотря на то, что некоторые разработчики утверждают, будто «ООП умерло», потребность в программистах, которые владеют этим подходом, продолжает расти.
Больше интересного про код в нашем телеграм-канале. Подписывайтесь!
Читайте также: