Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лаб_12_классы.doc
Скачиваний:
4
Добавлен:
01.03.2025
Размер:
176.64 Кб
Скачать

Лабораторная работа № 12. Классы в c#. Операции класса

Цель: формирование целостного представления о сущности и назначении классов, основных операциях классов, овладение практическими навыками работы с классами в C#.

Необходимые теоретические сведения

В C# классы могут выполнять роль модулей или типов данных.

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

При этом одни и те же задачи могут решать программы, состоящие как из одного, так и из нескольких модулей.

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

С этой точки зрения состав класса определяется той абстракцией данных, которую должен реализовать класс. Так, например, в классе Банковский_счет нельзя добавить поля класса Автомобиль.

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

Объявляются классы с использованием ключевого слова class:

<модификатор> class ИмяКласса: <ИмяРодителя>, <Интерфейсы>

{ // Члены класса }

Модификаторы доступа к классу

Модификатор

Назначение

Отсутствует или internal

Доступ к классу может быть получен только из текущего класса

public

Общедоступный

abstract / internal abstract

Доступ к классу только из текущего проекта / + не допускает создания экземпляров

public abstract

Общедоступный, не допускает создания экземпляров

sealed / internal sealed

Не допускает наличия потомков-классов / + доступ только из текущего проекта

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

Герметизированный класс (sealed) – не допускает наследования от него никаких других классов.

<Имя_родителя> - ссылка на базовый класс. В C# базовый класс может быть только один. Производный класс не может быть более доступным, чем базовый:

Верно!

Неверно!

public class Баз_класс

{// Члены класса}

internal class Произв_класс: Баз_класс

{// Члены класса}

internal class Баз_класс

{// Члены класса}

public class Произв_класс: Баз_класс

{// Члены класса}

В определении класса могут указываться поддерживаемые интерфейсы (перечисляются только после определения базового класса, если таковой имеется!):

public class Класс_Б : Класс_А, Инт_1, Инт_ 2.

Объекты создаются явным или неявным образом, то есть либо программистом, либо системой. Программист создает экземпляр класса с помощью операции new, например:

Demo a = new Demo (); // Создается экземпляр класса Demo

Если достаточный для хранения объекта объем памяти выделить не уда­лось, то генерируется исключение OutOfMemoryException.

В теле класса могут быть объявлены:

  • константы;

  • поля;

  • конструкторы и деструкторы;

  • методы;

  • события;

  • делегаты;

  • вложенные классы (структуры, интерфейсы, перечисления).

Основу класса составляют его конструкторы, поля и методы.

Поле – переменная экземпляра, представляющая собой данные конкретного объекта (по сути это простая переменная).

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

Например, класс Персона может иметь поле Рост, значения которого для разных объектов будут Низкий, Средний, Высокий.

Объявляются поля как обычные переменные:

class Мой_класс

{

int Число;

string Строка;

static void Main()

{ // }

}

Доступ к полям определяется соответствующим модификатором: public, private (модификатор по умолчанию, т.е. все поля класса по умолчанию являются закрытыми), protected (защищенные поля – доступны для методов производных классов), internal.

Независимо от значения атрибута, все поля класса доступны для всех методов данного класса.

Упражнение 1. Создание класса

class Circle

{ public int x=0;

public int y=0;

public int radius=3;

public const double pi = 3.14;

public static string name = "Окружность";

double p;

double s;

}

class Program

{ static void Main()

{ Circle cr = new Circle(); // создание экземпляра класса

Console.WriteLine("pi="+Circle.pi);// обращение к константе

Console.Write(Circle.name); // обращение к статическому полю

//обращение к обычным полям

Console.WriteLine(" с центром в точке ({0},{1}) и радиусом {2}", cr.x, cr.y, cr.radius);

// Console.WriteLine(cr.p); - вызовет ошибку, т.к. поля p, c имеют тип private

Console.Write("Введите коэффициент= ");

int kof = int.Parse(Console.ReadLine());

cr.x -= kof; cr.y += kof; cr.radius *= kof;

Console.WriteLine(" Новая окружность с центром в точке ({0},{1}) и радиусом {2}", cr.x, cr.y, cr.radius);

//cr.s = 2 * Circle.pi * cr.radius; - вызовет ошибку, т.к. поля s, c имеют тип private

}}

Методы класса содержат описания операций, доступных над объектами класса. Атрибуты: public, private (по умолчанию), protected, internal.

Модификатор

Назначение

public (общедоступный)

Метод доступен отовсюду

private (приватный)

Доступен только из класса, в котором описан

protected (защищенный)

Доступен из класса, в котором описан, а также из любых производных классов

internal (внутренний)

Доступен из всех классов внутри сборки, в которой он описан

protected internal

Действует как protected или internal

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

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

Упражнение 2. Работа с методами класса.

class Circle

{ public int x=0;

public int y=0;

public int radius=3;

public const double pi = 3.14;

public static string name = "Окружность";

public Circle T() // метод возвращает ссылку на экземпляр класса

{

return this;

}

public void Set(int x, int y, int r)

{

this.x = x;

this.y = y;

radius=r;

}

}

class Program

{ static void Main()

{

Circle cr = new Circle(); //создание экземпляра класса

Console.WriteLine("pi="+Circle.pi); // обращение к константе

Console.Write(Circle.name); // обращение к статическому полю

//обращение к обычным полям

Console.WriteLine(" с центром в точке ({0},{1}) и радиусом {2}", cr.x, cr.y, cr.radius);

cr.Set(1, 1, 10);

Console.WriteLine("Новая окружность с центром в точке ({0},{1}) и радиусом {2}",

cr.x, cr.y, cr.radius);

Circle b=cr.T();//получаем ссылку на объект cr, аналог b=c

Console.WriteLine("Новая ссылка на окружность с центром в точке ({0},{1}) и радиусом {2}", b.x, b.y, b.radius);

}

}

Методы-свойства (Propertis) – поля, которые, с одной стороны, доступны для использования, с другой стороны, имеют ограничения в отношении действий, выполняемых над этим полем. При работе со свойствами объекта для реализации доступа могут быть выбраны следующие стратегии:

  • чтение и запись (Read, Write);

  • чтение, запись при первом обращении (Read, Write-once);

  • только чтение (Read-only);

  • только запись (Write-only);

  • ни чтения, ни записи (Not Read, Not Write).

Открытость свойств (public) позволяет реализовать только 1-ую стратегию.

Синтаксис метода-свойства:

public возвращаемый_тип_значения Имя_метода-свойства

{ // Тело метода свойства

[get код_доступа]

[set код_доступа] }

Имя_метода-свойства обычно близко к имени поля.

Код_доступа представляет собой блоки операторов, которые выполняются при получении (get) или установке (set) свойства. Метод get возвращает текущее значение свойства, метод set помещает в свойство новое значение, хранящееся в служебной переменной со стандартным именем value.

Может отсутствовать либо часть get, либо set, но не обе одновременно. Если отсутствует часть set, то свойство доступно только для чтения. Если отсутствует часть get, то свойство доступно только для записи.

Пример 1. В классе Person создать строковое поле fam и свойство Fam строкового типа:

class Person

{

string fam = ""; // Закрытое поле

public string Fam // Открытое свойство

{

get {return fam;} // Получение значения свойства

set {fam = value;} // Установка значения

}

}

Привлечение свойства Fam в примере 1 никак не влияет на характер доступа к полю fam: проще сделать открытым само поле.

Если, например, поле fam должно получать значение лишь один раз, метод set может быть таким:

set { i f(fam == "") fam = value;}

Пример 2. Добавить в класс Person закрытое вещественное поле salary (жалованье) и одноименное открытое свойство (доступно только для записи).

class Person

{

float salary = 0; // Закрытое поле

public float Salary // Открытое свойство только для записи

{

// Отсутствие метода get в свойстве Salary легко делает это поле доступным только для записи

set {salary = value;}}

}

}

Примечание. Закрытые поля доступны методам класса Person, поэтому поле salary может учитываться в них.

Упражнение 3. Имеется класс Персона, у которого есть следующие поля: фамилия (может быть задана 1 раз), статус (доступно только для чтения), зарплата (недоступна для чтения), возраст (доступно для чтения и записи), здоровье (закрыто для доступа, информация о здоровье может быть сообщена только специальными методами класса).

namespace ConsoleApplication1

{public class Персона

{ //Все поля закрыты

string фамилия = "", статус = "", здоровье = "";

int возраст = 0, зарплата = 0;

//Методы-свойства

//Чтение, запись при первом обращении (Read, Write-once)

public string Фамилия

{ set { if (фамилия == "") фамилия = value; }

get { return (фамилия); }

}

//стратегия - только чтение (Read-only)

public string Статус

{ get { return (статус); }}

//Стратегия - чтение и запись (Read, Write)

public int Возраст

{set

{ возраст = value;

if (возраст < 7) статус = "ребенок";

else if (возраст < 17) статус = "школьник";

else if (возраст < 22) статус = "студент";

else статус = "служащий"; }

get { return (возраст); }}

//Стратегия - только запись (Write-only)

public int Зарплата

{ set { зарплата = value; }}}

class Program

{ static void Main()

{Персона персона_1 = new Персона();

персона_1.Фамилия = "Петров";

персона_1.Возраст = 21;

персона_1.Зарплата = 1000;

Console.WriteLine("Фамилия = {0}, возраст = {1} лет, статус = {2}", персона_1.Фамилия, персона_1.Возраст, персона_1.Статус);

персона_1.Фамилия = "Иванов"; персона_1.Возраст += 1;

Console.WriteLine("Фамилия = {0}, возраст = {1} лет, статус = {2}", персона_1.Фамилия, персона_1.Возраст, персона_1.Статус);

Console.ReadKey();

}}}

Результат работы программы:

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]