VirQ. Классы в C#
Язык C# входит в ТОП-5
самых популярных языков
программирования
Главная /
Учебник
/
Классы
Статей на сайте: 61

Классы


Классы - это самое мощное направление в программировании. Это настолько обширная тема, что коротко в 1 странице описать её просто невозможно. Попробую дать основные понятия.

Для начала: класс - это программное представление какого-либо объекта. Под объектом можно подразумевать абсолютно всё. Например, компьютерного персонажа в игре, модуль для работы с файлом определённого типа, животное, двигатель машины, страницу учебника и т.п.

Давайте рассмотрим самого себя, как человека. В программировании его тоже можно представить, как класс. Класс, который содержит в себе набор каких-то свойств, присущих любому человеку на Земле: вес, рост, имя.

Программно это будет выглядеть так:
[code] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virq { class Man { //Тут будет описание свойств и методов } class Program { static void Main(string[] args) { //Тут будет реализовано использование этого класса Console.ReadKey(); } } } [/code]
Это полный код программы-консоли. Классы описываются в пространстве имён namespace отдельно от рабочего кода (class Program).

Добавим нашему классу 3 поля (это не свойства - о них отдельно написано).
[code] class Man { double weight; //вес double height; //рост string name; //имя } [/code]
Класс создаётся так:
[code] Man m1 = new Man(); [/code]
Вместо m1 может быть любая другая переменная.
Получить список всех полей можно через точку.
m1.height
m1.weight
m1.name
Однако, если ввести m1.
то вы не увидите этих полей


Это потому что поля по умолчанию скрыты. Надо дописать в классе Man возле каждого поля ключевое слово public
[code] class Man { public double weight; //вес public double height; //рост public string name; //имя } [/code]
Тогда в основном коде после ввода m1.
вы увидите эти поля:


Получив к ним доступ, создадим 3 экземпляра класса Man:
[code] class Program { static void Main(string[] args) { Man m1 = new Man(); //m1 - первый человек m1.weight = 67.4; m1.height = 172.8; m1.name = "Виктор"; Man m2 = new Man(); //m2 - второй человек m2.weight = 59.1; m2.height = 164.7; m2.name = "Елена"; Man m3 = new Man(); //m3 - третий человек m3.weight = 56.9; m3.height = 165.5; m3.name = "Вика"; Console.ReadKey(); } } [/code]
Сам по себе класс - это шаблон.
Экземпляры классы - это копии, созданные по подобию шаблона.
На подобии этого:

Это класс



А это экземпляры этого класса




Полный код выглядит сейчас так:
[code] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virq { class Man { public double weight; //вес public double height; //рост public string name; //имя } class Program { static void Main(string[] args) { Man m1 = new Man(); //m1 - первый человек m1.weight = 67.4; m1.height = 172.8; m1.name = "Виктор"; Man m2 = new Man(); //m2 - второй человек m2.weight = 59.1; m2.height = 164.7; m2.name = "Елена"; Man m3 = new Man(); //m3 - третий человек m3.weight = 56.9; m3.height = 165.5; m3.name = "Вика"; Console.ReadKey(); } } } [/code]

Удобнее, конечно, когда класс содержит конструктор, позволяющий вносить значения полей сразу при его создании.
Изменим сперва класс:
[code] class Man { public double weight; //вес public double height; //рост public string name; //имя public Man(double w, double h, string nm) { weight = w; height = h; name = nm; } } [/code]
Данная конструкция показывает, что уже нельзя будет создавать пустой класс через new Man(). Он теперь будет требовать ввод 3 переменных.
В основном коде будет теперь такая запись:
[code] Man m1 = new Man(67.4, 172.8, "Виктор"); //m1 - первый человек Man m2 = new Man(59.1, 164.7, "Елена"); //m2 - второй человек Man m3 = new Man(56.9, 165.5, "Вика"); //m3 - третий человек Console.ReadKey(); [/code]
Согласитесь, симпатичнее код выглядеть стал.
Теперь при открытии скобки после Man( вы получите вот это:


и тут сразу видно
1) сколько нужно ввести переменных
2) какого они типа (double, double, string)

Класс удобнее создавать в отдельном файле, т.к. программа может содержать 10 различных классов, а в крупном проекте и несколько сотен.
Делать это надо так. Справа (у кого-то в другом месте может быть) у вас есть обозреватель решений.


Вместо появившегося имени Class1.cs напишите Man


Добавить
И получите вот такой код
[code] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virq { class Man { } } [/code]
в отдельном файле


Перенесите содержимое класса Man из основного кода сюда.
В итоге получится:

Для класса Man

[code] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virq { class Man { public double weight; //вес public double height; //рост public string name; //имя public Man(double w, double h, string nm) { weight = w; height = h; name = nm; } } } [/code]

Для класса Program (основной код)

[code] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virq { class Program { static void Main(string[] args) { Man m1 = new Man(67.4, 172.8, "Виктор"); //m1 - первый человек Man m2 = new Man(59.1, 164.7, "Елена"); //m2 - второй человек Man m3 = new Man(56.9, 165.5, "Вика"); //m3 - третий человек Console.ReadKey(); } } } [/code]
Теперь, чтобы вывести, скажем, вес 1-го человека, надо написать так:
[code] Console.WriteLine(m1.weight); [/code]
Для получения имени 3-го человека пишем так:
[code] Console.WriteLine(m3.name); [/code]

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

Пример:
[code] using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Virq { class Barrel //ДУЛО { public double d; //диаметр public double length; //длина } class Tank { public string name; //название танка public Barrel barrel; //дуло } class Program { static void Main(string[] args) { Tank tank = new Tank(); tank.name = "T34"; tank.barrel.d = 0.12; tank.barrel.length = 8; Console.ReadKey(); } } } [/code]
Описываем класс Barrel (дуло), который содержит 2 поля d (диаметр) и length (длину дула)
А так же класс Tank, который имеет 2 поля: name - его название и Barrel - дуло
Запись выглядит так:
[code] tank.barrel.length = 8; //длина дула танка [/code]

Дополнительная информация о том, как вывести результат в консоли или WinForm