Введение в C#: Что такое классы в программировании

Когда мы говорим о языке программирование C# мы подразумеваем ООП. А ООП, как известно, это классы, которые необходимо создавать. Однако как показывает мой личный опыт, далеко не все имеют представление о том, что такое класс в программировании…
Понятие того — что такое класс очень важно. Невозможно писать программы, если Вы не осознаете с чем работаете и не можете объяснить это своими словами. Я постараюсь описать Вам свое видение понятия класса в очень примитивной и грубой форме. Однако, на мой взгляд, только так можно поведать в тексте (не в лекциях, не в видео) начинающим программистам что такое класс.
Класс в программировании — это универсальный конструктор описания объектов и терминов. Под объектами мы подразумеваем как любой объект окружающего нас мира (будь то человек, камень или солнечная система), так и любой несуществующий в природе объект (например описание монстра «запупырки» или набора из четырех целых и одного дробного числа). Под термины же попадают всевозможные определения (например, геометрическая точка, предел, какая-нибудь болезнь).
Заметьте, я не зря выделил фразу «конструктор описания». Класс — по своей сути это не рабочий объект (особенно это видно, если вы программируете на языке C++), класс это абстрактное описание чего-либо. Говоря о «абстрактном описании» мы говорим об объектах в целом, а не о каком-либо конкретном предмете или термине (например, если речь идет о людях — мы говорим о понятии «человек», а не о конкретной личности «Иван Иванов»). Класс так же можно сравнить с подробной шаблонной инструкцией по эксплуатации, которую можно положить вместе с любой покупаемой техникой определенной категории. Для покупателя (пользователя программы) телевизор (объект) — это черный ящик. Конечному пользователю не нужно знать, как устроено внутри его приобретение, но ему нужно знать, что и как с этим можно делать на уровне пользования. С другой стороны существует и производитель данного телевизора (разработчик, создавший, и возможно расширивший, объект класса телевизор), который обязан иметь определенный набор знаний о производимом изделии (то что должно быть у всех телевизоров), но при этом не ограничивающийся только ими (создается инструкция на конкретную модель телевизора). Есть еще и третья сторона — изобретатель телевизора (разработчик создавший класс). Именно он описывает то, что должно быть у телевизора и как это должно работать (создает инструкцию для телевизора в целом как для категории товара, а не на конкретную модель).
Разрабатывая программно обеспечение, Вы часто будете выступать за вторую и третью стороны. Вам нужно будет и создавать классы и использовать их, а так же расширять их базовый функционал. Поэтому очень важно прорабатывать структуру вашего класса, чтобы она была удобна в использовании и легко дополнялась новыми возможностями.
Когда перед Вами стоит задача создать класс, который будет описывать существующий объект — не стоит изобретать велосипед. Природа или человечество уже придумали необходимую вам «инструкцию», старайтесь придерживаться ее. Например, если Вам нужно создать класс, описывающий точку в двухмерном пространстве» не нужно наделять ее магическими свойствами. Точка базовый элемент, который описывается своей позицией по оси Х и Y. Не нужно усложнять это определение. Так же не нужно придумывать «новые» имена осям координат (например, менять X на V, а Y на A) — лучше вы точно никому не сделаете. Так же, возможно, Вам наоборот лучше упросить описание под свой конкретный случай. В итоге пишите такой код, и этого будет более чем достаточно:

class MyPoint {
     public int X { get; set; }
     public int Y { get; set; }

     public MyPoint(int x, int y) 
     {
         this.X = x;
         this.Y = y;
     }

     public MyPoint (): this(0, 0) { } 
}

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

Задача: создать класс «Телевизор».

Разработка класса Телевизор
Будучи разработчиком (изобретателем телевизора), перед которым стоит такая задача, нужно сразу отметить для себя, что понятие «Телевизор» вполне себе стандартизировано. Сам телевизор уже изобретен, нам нужно лишь «изобрести» класс. Мы все всё знаем о телевизорах и что у них может быть, а так же что они должны уметь делать. Например мы слету можем сказать, что у телевизоров есть название модели, производитель, вес, цвет и некоторые другие свойства. Так же мы знаем что телевизор может менять свою громкость, работать с разными каналами. Еще раз акцентирую Ваше внимание — Мы, как разработчики (в нашем случае телевизора), оперируем общими понятиями. Мы создаем шаблонную инструкцию для категории товаров «телевизор». Мы отпустим данную инструкцию в свободное плаванье, чтобы другие изобретатели смогли создавать свои телевизоры, подставляя нужные значения в наш шаблон, и, при необходимости, добавляя новые функциональные возможности и свойства.

Пример класса телевизор:

    class TV
    {
        private int _currentChannel = 1;
        
        public int VolumeLevel { get; private set; }
        public string Manufacturer { get; private set; }
        public string Model { get; private set; }
        public float Weight { get; private set; }
        public bool IsColor { get; private set; }

        public TV(string manufacturer, string model, float weight, bool isCoolor)
        {
            this.VolumeLevel = 7;
            this.Manufacturer = manufacturer;
            this.Model = model;
            this.Weight = weight;
            this.IsColor = isCoolor;
        }

        public int ChangeChannel(int newChannel)
        {
            this._currentChannel = newChannel;
            return newChannel;
        }

        public int VolumeUp()
        {
            this.VolumeLevel++;
            return this.VolumeLevel;
        }

        public int VolumeDown()
        {
            this.VolumeLevel--;
            return this.VolumeLevel;
        }
    }

Использование класса Телевизор
Отпустив данный шаблон в свободное плаванье, мы уже можем создавать различные телевизоры и работать с ними, используя их возможности. Т.е. теперь мы выступаем в качестве 2ой стороны (разработчика, использующего объекты того или иного класса). Для наглядности опишем наши действия будто мы заводе 🙂

//Произвели черно белый телевизор Samsung GT1 весом 1кг 
TV samsungGT1 = new TV("Samsung", "GT1", 1, false);
//Произвели цветной телевизор Samsung GTC1 весом 1.5кг
TV samsungGTC1 = new TV("Samsung", "GTC1", 1.5, true);
//Произвели цветной телевизор LG D123 весом 10кг
TV lgD123 = new TV("LG", "D123", 10, true);

//Переключили телевизор LG на 10ый канал
lgD123.ChangeChannel(10);
//Прибавим громкость у телевизора SAMSUNG GT1 на 1 пункт
samsungGT1.VolumeUp();