C#: ООП. Классы

Spread the love

В C#, классы представляют собой основной строительный блок объектно-ориентированного программирования (ООП). Классы определяют шаблон для создания объектов, которые объединяют данные (поля) и методы (функции) для работы с этими данными. Классы служат для создания экземпляров объектов, которые представляют конкретные экземпляры класса.

Вот пример определения класса и создания объекта этого класса в C#:

“`csharp

using System;

// Определение класса

class Person

100000R, 12%, 1 year

{

    // Поля (данные) класса

    public string Name;

    public int Age;

    // Метод класса

    public void SayHello()

    {

        Console.WriteLine(“Привет, меня зовут ” + Name + ” и мне ” + Age + ” лет.”);

    }

}

class Program

{

    static void Main()

    {

        // Создание объекта класса Person

        Person person1 = new Person();

        person1.Name = “John”;

        person1.Age = 30;

        // Вызов метода объекта

        person1.SayHello();

        // Создание еще одного объекта класса Person

        Person person2 = new Person();

        person2.Name = “Alice”;

        person2.Age = 25;

        person2.SayHello();

        Console.WriteLine(“Нажмите любую клавишу для выхода…”);

        Console.ReadKey();

    }

}

“`

В этом примере определен класс `Person`, который имеет два поля – `Name` и `Age`, и один метод – `SayHello()`. Затем мы создали два объекта (`person1` и `person2`) класса `Person`, установили их поля и вызвали метод `SayHello()` для каждого объекта. Результат выполнения программы будет:

“`

Привет, меня зовут John и мне 30 лет.

Привет, меня зовут Alice и мне 25 лет.

“`

Обратите внимание, что классы могут иметь и другие элементы, такие как свойства, конструкторы, индексаторы, статические поля и методы, а также различные модификаторы доступа, которые определяют видимость класса и его членов в других частях кода. Классы также могут наследоваться от других классов и реализовывать интерфейсы, что дает дополнительные возможности для организации кода и создания иерархий классов.

Конструкторы.

В C#, конструкторы – это специальные методы внутри классов, которые вызываются при создании объекта данного класса. Конструкторы предназначены для инициализации данных объекта и выполнения необходимых действий при его создании.

Конструкторы в C# имеют то же имя, что и имя класса, и не возвращают значение (даже void). Они вызываются с помощью оператора `new` при создании объекта класса. В классе может быть несколько конструкторов с различными параметрами, что позволяет создавать объекты с разными начальными значениями.

Вот пример класса с несколькими конструкторами:

“`csharp

using System;

class Person

{

    public string Name;

    public int Age;

    // Конструктор без параметров

    public Person()

    {

        Name = “Unknown”;

        Age = 0;

    }

    // Конструктор с параметрами

    public Person(string name, int age)

    {

        Name = name;

        Age = age;

    }

    public void SayHello()

    {

        Console.WriteLine(“Привет, меня зовут ” + Name + ” и мне ” + Age + ” лет.”);

    }

}

class Program

{

    static void Main()

    {

        // Используем конструктор без параметров

        Person person1 = new Person();

        person1.SayHello();

        // Используем конструктор с параметрами

        Person person2 = new Person(“John”, 30);

        person2.SayHello();

        Console.WriteLine(“Нажмите любую клавишу для выхода…”);

        Console.ReadKey();

    }

}

“`

В этом примере определен класс `Person` с двумя конструкторами. Конструктор без параметров инициализирует поля `Name` и `Age` значением “Unknown” и 0 соответственно. Конструктор с параметрами принимает имя и возраст в качестве аргументов и устанавливает их в поля объекта.

При выполнении программы вывод будет следующим:

“`

Привет, меня зовут Unknown и мне 0 лет.

Привет, меня зовут John и мне 30 лет.

“`

Конструкторы позволяют обеспечить корректное инициализацию объектов при их создании и предоставляют более удобный способ задания начальных значений для полей объектов.

Поля.

В объектно-ориентированном программировании (ООП) в C#, поля (также называемые переменными экземпляра) являются членами класса, которые представляют данные, принадлежащие каждому экземпляру объекта этого класса. Каждый объект класса имеет свои собственные значения для этих полей.

Чтобы объявить поле в классе, его нужно указать внутри класса, но вне любых методов или свойств. Поля могут быть различных типов данных, таких как целые числа, строки, булевые значения, а также пользовательские типы данных (другие классы).

Вот пример определения класса с полями:

“`csharp

using System;

class Person

{

    // Поля класса

    public string Name;

    public int Age;

}

“`

В этом примере класс `Person` имеет два поля: `Name` (строка) и `Age` (целое число). Эти поля представляют данные о имени и возрасте объекта типа `Person`.

Чтобы создать объект этого класса и установить значения его полей, используйте конструктор класса и оператор `new`:

“`csharp

Person person1 = new Person();

person1.Name = “John”;

person1.Age = 30;

Person person2 = new Person();

person2.Name = “Alice”;

person2.Age = 25;

“`

В примере выше мы создали два объекта класса `Person` – `person1` и `person2`, и установили значения их полей `Name` и `Age`.

После того, как поля объекта были установлены, вы можете использовать их для выполнения операций с объектами, например, для вывода данных:

“`csharp

Console.WriteLine(“Привет, меня зовут ” + person1.Name + ” и мне ” + person1.Age + ” лет.”);

Console.WriteLine(“Привет, меня зовут ” + person2.Name + ” и мне ” + person2.Age + ” лет.”);

“`

Результат вывода будет:

“`

Привет, меня зовут John и мне 30 лет.

Привет, меня зовут Alice и мне 25 лет.

“`

Поля в классе обеспечивают хранение данных и состояния объектов, что является одним из основных принципов объектно-ориентированного программирования – инкапсуляцией

Методы

В объектно-ориентированном программировании (ООП) в C#, методы являются членами класса, которые представляют поведение или действия, которые может выполнять объект данного класса. Методы определяют операции, которые объекты класса могут выполнять с данными (полями) этого класса или сами собой.

Для определения метода в классе, его нужно указать внутри класса, после определения полей, но вне других методов или свойств. Методы могут возвращать значения или быть `void` (не возвращать значений).

Вот пример определения класса с методами:

“`csharp

using System;

class Calculator

{

    // Метод, который возвращает результат сложения двух чисел

    public int Add(int a, int b)

    {

        return a + b;

    }

    // Метод, который возвращает результат вычитания двух чисел

    public int Subtract(int a, int b)

    {

        return a – b;

    }

    // Метод, который выводит приветствие на консоль

    public void Greet(string name)

    {

        Console.WriteLine(“Привет, ” + name + “!”);

    }

}

“`

В этом примере класс `Calculator` имеет три метода: `Add`, `Subtract` и `Greet`. Метод `Add` принимает два аргумента типа `int` и возвращает результат их сложения. Метод `Subtract` также принимает два аргумента типа `int` и возвращает результат их вычитания. Метод `Greet` принимает строку `name` и выводит приветствие на консоль.

Чтобы использовать методы класса, нужно создать объект этого класса и вызвать методы у созданного объекта:

“`csharp

Calculator calculator = new Calculator();

int sumResult = calculator.Add(10, 5);

Console.WriteLine(“Результат сложения: ” + sumResult);

int subtractResult = calculator.Subtract(10, 5);

Console.WriteLine(“Результат вычитания: ” + subtractResult);

calculator.Greet(“John”);

“`

Результат вывода будет:

“`

Результат сложения: 15

Результат вычитания: 5

Привет, John!

“`

Методы позволяют объединить поведение и функциональность, которую может предоставлять объект класса, и обеспечивают исполнение операций с данными этого класса или другие операции. Важно правильно проектировать и называть методы, чтобы они были понятны и выполняли только одну задачу.

Параметры переменной длины (params).

В C#, параметры переменной длины (params) – это механизм, который позволяет передавать переменное количество аргументов в метод. Он позволяет вызывать метод с различным количеством аргументов, что делает код более гибким и удобным.

Для использования параметров переменной длины, в методе нужно указать ключевое слово `params` перед типом параметра в его объявлении. Параметр с ключевым словом `params` должен быть одномерным массивом.

Вот пример использования параметров переменной длины:

“`csharp

using System;

class Program

{

    // Метод, принимающий параметры переменной длины

    public static void DisplayNumbers(params int[] numbers)

    {

        Console.Write(“Числа: “);

        foreach (int num in numbers)

        {

            Console.Write(num + ” “);

        }

        Console.WriteLine();

    }

    static void Main()

    {

        DisplayNumbers(1, 2, 3); // Передаем 3 аргумента

        DisplayNumbers(10, 20, 30, 40, 50); // Передаем 5 аргументов

        DisplayNumbers(); // Можно вызывать метод и без аргументов

        Console.WriteLine(“Нажмите любую клавишу для выхода…”);

        Console.ReadKey();

    }

}

“`

В этом примере у нас есть метод `DisplayNumbers`, который принимает параметр переменной длины `params int[] numbers`. В методе мы выводим переданные числа на консоль. Мы можем вызывать этот метод с разным количеством аргументов, в том числе и без аргументов.

Результат вывода будет:

“`

Числа: 1 2 3

Числа: 10 20 30 40 50

Числа:

“`

Параметры переменной длины удобны в случаях, когда нам нужно передавать различное количество аргументов в метод и делать метод более гибким. Однако стоит помнить, что параметр с ключевым словом `params` должен быть последним параметром в списке параметров метода, и каждый метод может иметь только один параметр с ключевым словом `params`.

Значения параметров метода по умолчанию (defolt params).

В C#, можно устанавливать значения параметров метода по умолчанию с помощью default parameters (параметры по умолчанию). Это позволяет вызывать методы с меньшим количеством аргументов, так как некоторые из них могут быть заранее определены в самом методе.

Для установки параметров метода по умолчанию, необходимо присвоить значения этим параметрам в его объявлении. Значения по умолчанию должны быть константными или статическими, что позволяет компилятору определить их во время компиляции.

Вот пример использования параметров метода по умолчанию:

“`csharp

using System;

class Program

{

    // Метод с параметрами по умолчанию

    public static void Greet(string name = “Гость”, int age = 0)

    {

        Console.WriteLine(“Привет, меня зовут ” + name + ” и мне ” + age + ” лет.”);

    }

    static void Main()

    {

        Greet(); // Будет использованы значения по умолчанию

        Greet(“John”); // Указываем только имя, возраст будет значение по умолчанию

        Greet(“Alice”, 25); // Указываем имя и возраст

        Console.WriteLine(“Нажмите любую клавишу для выхода…”);

        Console.ReadKey();

    }

}

“`

В этом примере метод `Greet` принимает два параметра – `name` и `age`. Мы установили значения по умолчанию для обоих параметров. Если значения не будут переданы при вызове метода, будут использоваться значения по умолчанию.

Результат вывода будет:

“`

Привет, меня зовут Гость и мне 0 лет.

Привет, меня зовут John и мне 0 лет.

Привет, меня зовут Alice и мне 25 лет.

“`

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

Свойства (properties).

В C#, свойства (properties) представляют собой механизм доступа к полям (данным) класса с использованием синтаксиса методов. Свойства позволяют контролировать доступ к данным, устанавливать или получать их значения, а также выполнять дополнительные операции при чтении или записи значения свойства.

Вместо того чтобы напрямую обращаться к полям класса, мы определяем свойства, которые обеспечивают доступ к этим полям. Свойства объединяют в себе методы для чтения (get) и записи (set) значений поля.

Вот пример определения класса с использованием свойств:

“`csharp

using System;

class Person

{

    // Поля класса (закрытые, доступные только внутри класса)

    private string name;

    private int age;

    // Свойство для доступа к полю name (только чтение)

    public string Name

    {

        get { return name; }

    }

    // Свойство для доступа к полю age (чтение и запись)

    public int Age

    {

        get { return age; }

        set

        {

            if (value >= 0) // Проверка на положительное значение возраста

                age = value;

        }

    }

}

“`

В этом примере класс `Person` имеет два закрытых поля (`name` и `age`) и два свойства (`Name` и `Age`). Свойство `Name` позволяет только чтение (т.е. мы можем получить значение поля `name`, но не можем его изменить). Свойство `Age` позволяет как чтение, так и запись значения в поле `age`, но при этом мы делаем проверку на положительное значение возраста.

Чтобы использовать свойства, нужно создать объект класса и обращаться к свойствам, как к обычным полям:

“`csharp

Person person = new Person();

person.Name = “John”; // Это невозможно, так как свойство Name только для чтения

person.Age = 30; // Записываем значение возраста через свойство Age

Console.WriteLine(“Имя: ” + person.Name); // Получаем значение имени через свойство Name

Console.WriteLine(“Возраст: ” + person.Age); // Получаем значение возраста через свойство Age

“`

Обратите внимание, что доступ к полю `name` напрямую недоступен извне класса, но доступ к свойствам `Name` и `Age` позволяет контролировать доступ к данным и добавлять дополнительную логику при чтении и записи значений.

События.

В C#, события представляют собой механизм, позволяющий классам и объектам отправлять уведомления о наступлении определенных событий другим классам или объектам. События являются частью паттерна программирования “Издатель-Подписчик” (Publisher-Subscriber) и используются для реализации асинхронного взаимодействия между компонентами программы.

События позволяют одним частям программы (издателям) генерировать уведомления о наступлении событий, а другим частям программы (подписчикам) подписываться на эти уведомления и реагировать на события.

Для создания события в C# нужно выполнить следующие шаги:

1. Определить делегат для события: Делегат определяет сигнатуру методов-обработчиков события. Эти методы будут вызываться, когда событие произойдет.

2. Определить событие: Событие определяется как публичное поле с типом делегата. Оно используется для добавления и удаления обработчиков события.

3. Генерация события: Когда происходит событие, издатель вызывает событие, что приводит к вызову всех зарегистрированных обработчиков события.

Вот пример простого класса с событием:

“`csharp

using System;

// Шаг 1: Определение делегата для события

public delegate void MyEventHandler(object sender, EventArgs e);

class MyEventPublisher

{

    // Шаг 2: Определение события

    public event MyEventHandler MyEvent;

    public void DoSomething()

    {

        // Шаг 3: Генерация события

        OnMyEvent(EventArgs.Empty);

    }

    protected virtual void OnMyEvent(EventArgs e)

    {

        MyEventHandler handler = MyEvent;

        if (handler != null)

        {

            handler(this, e);

        }

    }

}

class Program

{

    static void Main()

    {

        MyEventPublisher publisher = new MyEventPublisher();

        // Подписка на событие

        publisher.MyEvent += MyEventHandlerMethod;

        // Генерация события

        publisher.DoSomething();

        Console.WriteLine(“Нажмите любую клавишу для выхода…”);

        Console.ReadKey();

    }

    static void MyEventHandlerMethod(object sender, EventArgs e)

    {

        Console.WriteLine(“Событие произошло!”);

    }

}

“`

В этом примере мы создаем класс `MyEventPublisher`, который имеет событие `MyEvent`. Метод `DoSomething()` генерирует событие путем вызова `OnMyEvent(EventArgs.Empty)`. В методе `OnMyEvent` проверяется наличие подписчиков события и вызываются все зарегистрированные обработчики события.

В методе `Main` создается объект `MyEventPublisher`, на котором подписывается метод `MyEventHandlerMethod` на событие `MyEvent`. После вызова `DoSomething()` событие происходит и вызывается обработчик события.

Результат выполнения программы:

“`

Событие произошло!

Нажмите любую клавишу для выхода…

“`

Таким образом, события в C# предоставляют механизм для реализации асинхронного взаимодействия между классами и объектами, что делает код более гибким и модульным.

Схема Классы

Spread the love

Добавить комментарий