Класс — это тип, создаваемый пользователем. Классы являются основным строительным материалом программ, написанных на языке C#. Если в C++ классы используют только в случае необходимости (их можно и вообще не применять!), то в C# всё построено на классах. Даже простейшая программа типа «Здравствуй, мир!» содержит в себе один класс. Обычно же программы на C# состоят из большого количества пользовательских классов.
Каждый класс определяет какую-нибудь сущность. При проектировании программы необходимо представить решаемую задачу в виде совокупности неких объектов, каждый из которых должен обладать необходимыми характеристиками. Совершено очевидно, что необходимо реализовать классы, в которые заложены эти возможности, а затем создавать и использовать в тексте программы объекты этих классов.
Понятие класса является основой концепции объектно-ориентированного программирования (ООП).
ООП базируется на трёх основных принципах: инкапсуляция, наследование и полиморфизм.
Инкапсуляция — это объединение под одним общим именем в виде класса данных (их часто называют полями) и методов по обработки этих данных. Вне класса по-умолчанию все поля и методы просто недоступны. Делается это с целью исключения ошибочного изменения полей «чужими» методами.
Именно благодаря такому искусственному сокрытию данных (и часто — методов) появляется возможность разработки больших программных комплексов (на миллионы строк кода), которые могут быть вполне работоспособны.
Принцип наследования — второй по значимости среди основных идей ООП. Благодаря наследованию мы можем на основе одного класса (класса-предка) спроектировать другой класс (класс-наследник), который унаследует от своего предка всё, что нам потребуется. Естественно, в классе-наследнике появятся какие-то новые свойства (поля, методы), которые расширят возможности класса-наследника. Но при этом нам не требуется заново разрабатывать тот программный код, который был в классе-предке. Понятно, что принцип наследования может существенно сократить сроки разработки новых программ и повысить их надёжность.
Термин полиморфизм переводится как многообразие форм. К элементам полиморфизма можно отнести перегрузку методов, перегрузку операции, использование виртуальных методов.
Принцип полиморфизма позволяет в ряде случаев заметно упростить проектирование программ, повысить её наглядность. Всё это также способствует повышению надёжности программного обеспечения и сокращению сроков его разработки.
Рассмотрев вкратце основные идеи ООП, далее перейдём к более подробному их изучению. И начнём с главного — как создавать и использовать классы.
Формально любой класс можно описать таким образом:
атрибуты class имя_класса: предки
{
члены_класса
}
где
атрибуты — одно из ключевых слов, определяющих доступность класса (например, public, protected, private), либо какие-то другие базовые свойства класса (static — статичный класс, abstract — абстрактный класс, sealed — бесплодный класс);
имя_класса — задаётся по общим правилам (как для любого идентификатора, например, как для имени переменной);
предки — необязательный параметр. Класс, который мы создаём, может быть наследником какого-то другого класса (но только одного!) и наследником любого количества интерфейсов (об интерфейсах речь пойдёт далее);
члены_класса — это данные, инкапсулированные в классе, и методы по их обработке.
Для того, чтобы использовать разработанный класс, необходимо где-то в программе создать объект этого класса и вызвать его метод:
имя_класса переменная = new имя_класса();
переменная.метод();
Здесь с помощью операции new создаётся объект нашего класса. В скобках как после имени класса, так и после названия метода возможны какие-либо параметры (если это определено в классе).
Вызов метода возможен только с использованием операции доступа (операция «точка». Указываем название переменной, имеющей тип данного класса, затем ставим точку и только потом пишем имя метода с возможными фактическими параметрами.
Для большей ясности сразу же рассмотрим пример с небольшим классом.
Пример. Создать класс, моделирующий работу с треугольником (задаются три стороны a, b и c и вычисляется площадь треугольника s).
Возможная реализация программы:
using System;
namespace Prim_Class0
{
class Treug
{
double a, b, c; // стороны треугольника
// метод для ввода данных
public void vvod()
{
Console.Write("a=");
a = double.Parse(Console.ReadLine());
Console.Write("b=");
b = double.Parse(Console.ReadLine());
Console.Write("c=");
c = double.Parse(Console.ReadLine());
}
// вычисление площади по формуле Герона
public double Pl()
{
double s = 0;
if (YesTreug())
{
double p = (a + b + c) / 2;
s = Math.Sqrt(p * (p - a) * (p - b) * (p - c));
}
else
{
Console.WriteLine("Треугольник не существует.");
s = -1;
}
return s;
}
// Закрытый метод для проверки существования треугольника
private bool YesTreug()
{
if(a + b > c && a + c > b && b + c > a)
return true;
else
return false;
}
}
class Program
{
public static void Main(string[] args)
{
Console.WriteLine("Тестирование класса Treug (треугольник)");
Treug x = new Treug();
x.vvod();
double s = x.Pl();
Console.WriteLine("Площадь треугольника s={0}", s);
Console.Write("Press any key to continue . . . ");
Console.ReadKey(true);
}
}
}
Результаты работы программы:
Тестирование класса Treug (треугольник)
a=3
b=4
c=5
Площадь треугольника s=6
Press any key to continue . . .
Пояснения к программе.
В данной программе имеется два класса:
Program — основной класс, в котором дано определение метода Main();
Treug — необходим для моделирования работы с объектами типа Треугольник.
В методе Main() класса Program создаётся объект x типа Treug
Treug x = new Treug();
После создания объекта x его поля имеют нулевые значения.
Затем вызывается метод для заполнения полей объекта x необходимыми значениями:
x.vvod();
Далее вычисляется площадь треугольника:
double s = x.Pl();
Теперь рассмотрим содержимое класса Treug
Этот класс содержит три поля a, b, c типа double. Эти поля по-умолчанию являются закрытыми, то есть они доступны только в методах этого класса (для них ни как не указана доступность):
double a, b, c;
Обычно доступность полей прописывается явно, например, в нашем случае можно было бы сделать так:
private double a, b, c;
или дать описание каждого поля по отдельности — это наиболее правильный подход при разработке больших сложных классов:
private double a;
private double b;
private double c;
В классе Treug определены три метода. Приведём их упрощённую запись (только заголовки) и дадим пояснения.
public void vvod() { … } — открытый метод, предназначенный для ввода данных. Метод vvod() не возвращает ни какого результата — об этом говорит ключевое слово void перед именем метода.
public double Pl() { … } — также открытый метод, вычисляющий площадь треугольника. Метод имеет тип результата double. Через имя метода возвращается результат вычислений.
private bool YesTreug() { … } — закрытый метод, определяющий возможность существования треугольника. Возвращает результат булевого типа.
Как видите, методы, необходимые для взаимодействия объекта класса Treug с внешним миром мы сделали открытыми (это методы vvod() и Pl()), а метод YesTreug(), решающий «внутренние проблемы» — закрытым.
|
|
|