Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Медведев_С++_CLI_C#_Java_J#.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
5.17 Mб
Скачать

11.4.1. Первый этап. Разработка класса Warehouse

Интерфейс объекта Warehouse содержит функции, обеспечивающие вы-

грузку из грузовика в склад и загрузку из склада в грузовик груза, и событие,

сообщающее грузовикам о необходимости изменения ими направления дви-

жения из-за переполнения склада.

Объект класса Warehouse, наследованный из класса UserControl (или

Panel), является управляющим интерфейсным элементом и, как все интер-

фейсные элементы, представляется в прикладном окне с использованием об-

щих свойств Location (getLocayion() и setLocation()), Size (getSize() и

setSize()), BackColor (getBackground() и setBackground()) и др. Те же самые

свойства могут применяться как к объектам класса Warehouse, так и внутри

самого класса Warehouse для выявления расположения его управляющего

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

Заметим, в следующем разделе будет применён базовый класс UserControl

(или Panel) при создании класса ContrlRegion. На рис. 11.4.1.1 представ-

лен класс Warehouse (для C#).

Warehouse

-left: bool

-allload: int

-partLoad; int

-timePeriod: int

+evFromWarehousB: DelEvFromWarehouse

+Warehousa()

+Put()

+Get()

#Change()

#OnPaint()

>UserCnntrol

+WarehnusaEtfantArqs

+Full: property

+Left: property

-left: bool

-full: bool

+Warflhangp.FvantArflftfr

^. +EventAras

<<.uie>> . . . ^ «-Monitor

L55.У?.е.>?....> +DelEvFromWarehouse

+Enter()

4Cxrt()

Рис. 11.4.1.1. Диаграмма классов склада Warehouse (для C#)

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

этому складу с грузом о необходимости смены направления движения. Дан-

ные события содержаться в специальном объекте класса WarehouseEventArgs

и включают свойства Full и Lefl, определяющие, возникло ли перепол-

нение или опустошение склада (Full), и в каком складе - левом или правом

(Left).

Делегат события определим так:

public delegate void DelEvFromWarehouse (object sender, WarehouseEventArgs

args);

А событие как:

public event DelEvFromWarehouse evFromWarehouse;

Для простоты реализации фиксируется максимальная вместимость all-

Load склада числом 100. Груз выгружается из грузовика в склад или загружа-

ется в грузовик из склада порциями по 10 единиц (partLoad) в течение 100 мс.

(timePeriod). Поскольку в течение этого времени должен обслуживаться

только один грузовик, функция Put() выгрузки и функция Get() загрузки

должны содержать критические секции, реализованные с помощью монитора

или оператора lock. Потокам других грузовиков, пытающимся выгрузиться

или загрузиться, придётся встать в очередь и дождаться, когда функции Put()

или Get() объекта склада, вызванные текущим грузовиком, выйдут из крити-

ческой секции.

Функции Put() и Get() используют общую функцию Change(), непо-

средственно добавляющую или убавляющую груз в складе

В примере 11.4.1.1 приведён класс Warehouse, написанный на языках C# и

Java. Класс Warchousc на языкс C# наследует класс LJserControl, а на языке

Java - класс Panel, каждый из которых позволяет перерисовывать собствен-

ную область соответствующего управляющего элемента.

Пример11.4.1.1. ^accWarehouse.

///////////////

// C# File csWarehouse.dll класс Warehouse

using System;

using System.Drawlng;

using System.Threading;

using System,Wlndows.Forms;

namespace csWarehouse

{

// Делегат события о переполнении и опустошении склада

public delegate void DelEvFromWarehouse (object sender,

WarehouseEventArgs args);

// Класс данных события evFromWarehouse

public class WarehouseEventArgs: EventArgs

{

private bool left; // Признак идентификации склада

private bool full; // Признак заполнения склада

// Конструктор

public WarehouseEventArgs (bool left, bool full)

{

this.left= left; this,full= full;

>

// Свойство заполнения склада

public bool Full

{

get {return full;>

>

// Свойство идентификации склада

public bool Left

{

get {return left;>

>

>

// Класс склада

public class Warehouse: UserControl

{

bool left; // Признак идентификации склада

int allLoad= 100; // Текущий размер груза в складе

lnt PartLoad= 10; // Размер груза грузовика