Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


МАССИВЫ ОБЪЕКТОВ СОБСТВЕННЫХ КЛАССОВ



МАССИВЫ ОБЪЕКТОВ СОБСТВЕННЫХ КЛАССОВ

  1. Способы описания структуры предметной области

Любая программа – модель предметной области, некоторой части реальности. Предметная область состоит из элементов, которые в свою очередь состоят из более простых элементов.

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

1. Массив

2. Объект

Взаимодействие этих механизмов приведено на рис.1.

 
 

рис.1

 

 

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

 

Массив объектов одного класса

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

 

Следствие:

Объект, на который указывает элемент массива, должен быть созданным явным образом с использованием операции new.

Массив значимых типовМассив объектов

int[] a; Тип[] b;

a=new int[2]; b=new Тип [2];

 

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_Тип возвращаемого значения_Имя свойства

// параметров нет, поэтому скобок после имени нет и быть не может

 

{ set {код для установки поля}

 

неявный параметр (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. Способы описания структуры предметной области

Любая программа – модель предметной области, некоторой части реальности. Предметная область состоит из элементов, которые в свою очередь состоят из более простых элементов.

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

1. Массив

2. Объект

Взаимодействие этих механизмов приведено на рис.1.

 
 

рис.1

 

 

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

 


Поделиться:



Последнее изменение этой страницы: 2017-04-12; Просмотров: 549; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.086 с.)
Главная | Случайная страница | Обратная связь