Если заниматься не только общим описанием этой темы, но и показать примеры, то нужно разобраться уже более конкретно: что и из чего состоит. Сейчас мы попробуем поработать уже с чем-то более осязаемым.
В рамках класса мы можем определять различные члены, которые будут являться частью объекта. На самом деле член может быть членом или класса или объекта. Разница в том, что когда член принадлежит всему классу – он доступен без создания объекта и как бы существует глобально. Такие члены называются статическими.
Если член определён в классе и не помечен как статический, то он является членом объекта. И обращаться к нему можно через экземпляр объекта. Нас интересует следующие члены:
- Поля
- Методы
- Конструкторы
Поля
Объект может содержать данные. Совокупность данных – это состояние объекта. Класс описывает что у каждого объекта должны быть определённые данные, а в каждом конкретном объекте свои данные.
Так например мы можем сказать что у нас есть класс Tank описывающий танк в игре. У каждого танка есть скорость хода, которую мы описываем как поле. А каждый объект уже содержит конкретное значение скорости.
Поля – это переменные привязанные к объекту. Правила определения примерно похожи. Соответственно когда мы создаём несколько объектов, мы имеем несколько переменных.
Фрагмент 1.35
class Tank
{
public int Speed;
}
В коде выше мы определили класс с одним полем Speed. Отличие от обычной переменной в том, что во-первых мы определили её в теле класса а не метода, а во-вторых в том, что мы указали модификатор доступа. Модификаторы доступа – это указание кому доступен этот член.
Часть объекта может быть доступна например всем желающим (публичные члены) и часть только самому объекту (приватные члены). Это необходимо для достижения различных концепций. Подробно об этом будет далее.
После определения класса мы можем начать создавать объекты.
Фрагмент 1.36
static void Main(string[] args)
{
Tank tank1 = new Tank();
Tank tank2 = new Tank();
tank1.Speed = 10;
tank2.Speed = 15;
}
В данном фрагменте мы создали в памяти два объекта типа Tank и назначили каждому танку свою скорость. Стоит упомянуть, что класс – это ссылочный тип.
Фрагмент 1.37
Tank tank1 = new Tank();
Tank tank2 = new Tank();
tank1 = tank2;
tank1.Speed = 10;
tank2.Speed = 15;
Console.WriteLine(tank1.Speed);
В данном случае в консоль выведется 15, так как переменная с типом класса хранит ссылку на объект. В строке “tank1 = tank2;” мы помещаем в переменную tank1 ссылку на объект, которая содержится в переменной tank2. Таким образом при изменении объекта по ссылке из переменной tank2 мы также будем работать с изменённым объектом по ссылке в переменной tank1.
Также вы могли заметить, что доступ к членам объекта происходит через оператор точка. Имея выражение которое является ссылкой на объект, мы можем применить к результату оператор точку и получить доступ к доступным нам членам.
Фрагмент 1.38
static void Main(string[] args)
{
(new Tank()).Speed = 10;
CreateNewTank().Speed = 10;
}
static Tank CreateNewTank()
{
return new Tank();
}