![]() |
Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология Образование Политология Производство Психология Стандартизация Технологии |
МАССИВЫ ОБЪЕКТОВ СОБСТВЕННЫХ КЛАССОВСтр 1 из 3Следующая ⇒
МАССИВЫ ОБЪЕКТОВ СОБСТВЕННЫХ КЛАССОВ
Любая программа – модель предметной области, некоторой части реальности. Предметная область состоит из элементов, которые в свою очередь состоят из более простых элементов. Современные языки программирования содержат механизмы, позволяющие отразить структуру элементов. Два самых распространенных механизма: 1. Массив 2. Объект Взаимодействие этих механизмов приведено на рис.1.
рис.1
Массив может содержать элемент, представляющий собой объект какого-то класса. В свою очередь, полем класса может быть массив. Комбинируя эти механизмы, можно определять сложные типы данных.
Массив объектов одного класса Механизм формирования массива объектов и работы с ним в целом идентичен массиву значимых типов. Принципиальное отличие массива объектов от массива значимых типов заключается в том, что объект определенного класса представляет собой ссылку, и, следовательно, массив объектов хранит не собственно объекты, а ссылки.
Следствие: Объект, на который указывает элемент массива, должен быть созданным явным образом с использованием операции new. Массив значимых типовМассив объектов int[] a; Тип[] b;
a[0]= 15; a[1]= 25;
Объект создаем в явном виде: b[0]=new Тип(); b[1]= new Тип();
В каждом классе по умолчанию определен конструктор без параметров. При создании объекта вызывается конструктор, в задачу которого входит начальная установка полей объектов: поля значимого типа – 0, поля ссылочного типа – null.
Пример: Определить класс «Студент» с полями: фамилия, Номер зачетной книжки, оценки за последнюю сессию и методом вывода данных о студенте на экран. class Студент { public string Фам; public int Зач; public int[] Оц;
public void Показать() { int i; Console.Write(Фам + Зач); for (i = 0; i < Оц.Length; i++) Console.Write(Оц[i]); Console.WriteLine(); } }
Создадим объект класса Студент:
Студент ст; ст = new Студент();
Фам Зач Оц «» 0 0
Конструктор может быть переопределен, в этом случае конструтор по умолчанию становится недоступным. Если есть необходимость в конструкторе без параметров, конструктор должен быть определен в явном виде.
Как правило, с помощью конструктора задаются начальные значения полей, эти значения могут быть приняты за счет параметров конструктора. В качестве параметра конструктора может быть выбран объект того же типа – конструктор копированияю Его задача – снять копию полей принятого объекта.
Различают два вида конструкторов копирования: 1. Поверхностное копирование (с полей значений снимается копия значений, с полей ссылок – копия ссылок) 2. Конструктор полного копирования (с полей значений снимается копия значений, для полей ссылок создается объект и в него копируются данные, на которые указывает ссылочное поле оригинала)
Конструктор с параметрами
public Студент (string Фам, int зач, int[] оц) { this.Фам = Фам; //this – ссылка на активный объект this.Зач=Зач; this.Оц=Оц; } Конструктор поверхностного копирования
public Студент (Студент ст) { Фам = ст.Фам; Зач = ст.Зач; Оц= ст.Оц; } Основная программа
Студент ст1; Студент ст2; int[] Оц; Оц=new int[]{10, 10}; ст1=new Студент («Петров», 777, Оц); ст2=new Студент (ст1);
При изменении массива оценок изменятся данные и в объекте ст1, и в объекте ст2.
Конструктор полного копирования
public Студент (string Фам, int зач, int[] оц) { this.Фам = Фам; this.Зач=Зач; this.Оц=new int[Оц.Length]; Array.Copy(Оц, 0, this. Оц, 0, Оц.Length); }
public Студент (Студент ст) { Фам = ст.Фам; Зач = ст.Зач; Оц= new int[Оц.Length]; Array.Copy(Оц, 0, this. Оц, 0, Оц.Length); }
У каждого объекта при копировании создается свой собственный массив оценок.
ИНКАПСУЛЯЦИЯ Свойства
Свойство – это метод для установки и-или получения закрытого поля. С этой точки зрения свойство относится к интерфейсной части класса.
Определение свойства: public_Тип возвращаемого значения_Имя свойства // параметров нет, поэтому скобок после имени нет и быть не может
неявный параметр (value) get {код для чтения поля} }
Свойства используются для поддержки инкапсуляции, создания виртуальных полей (т.е. реально полей нет, но у пользователя создается впечатление, что они есть; на самом деле значение вычисляется).
Пример Определить класс Точка на плоскости в прямоугольных координатах, точка может располагаться только выше оси х или на ней.
Предусмотреть возможность изменения координат точки и вычисление расстояния до нее. Операции рассматривать, как свойства.
class Точка { private double x, y;
public double xp { set { x = value; } get { return x; } }
public double yp { set { if (value > = 0) y = value; else y = 0; } get { return y; } }
public double Dp { get { return Math.Sqrt(x * x + y * y); } } }
class Program { public static void Main() { Точка t; t = new Точка(); t.xp = 3.0; t.yp = 4.0; t.Dp; // => 5.0 } }
АГРЕГАЦИЯ Агрегация на основе классов При реализации агрегации на основе классов необходимо исходить из того факта, что класс относится к ссылочным типам, т.е. имя объекта – ссылка на область памяти, где хранится объект. Следовательно типичная схема будет иметь вид:
Изменение состояния объекта-части вне рамок объекта-контейнера немедленно изменяет состояние контейнера. Базовый пример Определить сущность «осветительный прибор», частями которого являются «корпус» и «лампочки». Осветительный прибор собирается из отдельно купленных частей и должен допускать их замену.
class Корпус { private string тип; // тип корпуса private double цена;
public string Тип { set { тип = value; } get { return тип; } }
private double Цена { set { цена = value; } get { return цена; } }
}
class Лампочка { private double мощность; private double цена;
public double Мощность { set { мощность = value; } get { return мощность; } }
public double Цена { set { цена = value; } get { return цена; } } }
class Прибор { private Корпус кор; private Лампочка лам; private string состояние; //включено или выключено
//конструктор public Прибор(Корпус кор, Лампочка лам, string состояние) { this.кор = кор; this.лам = лам; this.состояние = состояние; }
//свойство public string Состояние { set { Состояние = value; } }
//вывести данные public void Показать() { Console.WriteLine(" {0} {1} {2} {3} {4} {5}", состояние, кор.Тип, кор.Цена, лам.Цена, лам.Мощность); } }
В основной программе соберем осветительный прибор из корпуса типа «Тюльпан» ценой 800 рублей и лампочки мощностью 60 Вт, ценой 30 рублей. class Корпус { private string тип; // тип корпуса private double цена;
public string Тип { set { тип = value; } get { return тип; } }
public double Цена { set { цена = value; } get { return цена; } }
}
class Лампочка { private double мощность; private double цена;
public double Мощность { set { мощность = value; } get { return мощность; } }
public double Цена { set { цена = value; } get { return цена; } } }
class Прибор { private Корпус кор; private Лампочка лам; private string состояние; //включено или выключено
//конструктор public Прибор(Корпус кор, Лампочка лам, string состояние) { this.кор = кор; this.лам = лам; this.состояние = состояние; }
//свойство public string Состояние { set { состояние = value; } }
//вывести данные public void Показать() { Console.WriteLine(" {0}, {1}, {2}, {3}, {4}, {5}", состояние, кор.Тип, кор.Цена, лам.Цена, лам.Мощность); } } class Program { static void Main() {//1. объявляем ссылки Корпус к; Лампочка л; Прибор п;
//2. создаем объкты к = new Корпус(); к.Тип = " Тюльпан"; к.Цена = 800.0;
л = new Лампочка(); л.Мощность = 60.0; л.Цена = 30.0;
//3., 4. контейнер п = new Прибор(к, л, " Включено" ); п.Показать();
//меняем лампочку л.Мощность = 200.0; п.Показать(); }
МАССИВЫ ОБЪЕКТОВ СОБСТВЕННЫХ КЛАССОВ
Любая программа – модель предметной области, некоторой части реальности. Предметная область состоит из элементов, которые в свою очередь состоят из более простых элементов. Современные языки программирования содержат механизмы, позволяющие отразить структуру элементов. Два самых распространенных механизма: 1. Массив 2. Объект Взаимодействие этих механизмов приведено на рис.1.
рис.1
Массив может содержать элемент, представляющий собой объект какого-то класса. В свою очередь, полем класса может быть массив. Комбинируя эти механизмы, можно определять сложные типы данных.
|
Последнее изменение этой страницы: 2017-04-12; Просмотров: 581; Нарушение авторского права страницы