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

Inf.Enter();

Inf.Enter();

Inf.Show();

Console.ReadKey();

}

}

8.Управляемые данные и их использование

8.1 Свойства в языках C++/CLI, C# и Java

C++/CLI и C#. В языках C++/CLI и C# появился новый тип данных - свойства. Свойство, описанное в классе, позволяет безопасно использовать связанную с ним закрытую обычную или ссылочную переменную, устанавливая или получая её значение. Свойство приписывает этой переменной имя свойства. В дальнейшем ссылка к переменной осуществляется через имя свойства. Достоинством свойства является не только контролируемое использование его переменной, но и то, что имя свойства можно применять в выражениях языка программирования. В дальнейшем мы увидим, что Visual Studio .NET предоставляет простые средства изменения данных в объектах через свойства этих объектов. Учитывая удобство свойств, почти все классы библиотеки .NET Framework изобилуют ими.

При использовании свойства автоматически выполняются функции set и get, которые устанавливают или получают значение переменной свойства, позволяя при этом осуществлять её контроль или выполнять с ней какие-либо действия. Эти функции определяются при описании свойства.

Пусть, например, в классе CPlane имеется свойство Speed, определяющее скорость самолёта. Тогда для объекта plane этого класса можно установить свойство как

plane.Speed= 600; // C#

а получить так

int speedPlane= plane.Speed; // C#

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

При получении значения свойства Speed автоматически выполняется функция get.

Описание свойств подчиняется строгим правилам, которые отличаются в языках C++/CLI и C#.

C#. В классе объявляется закрытая переменная свойства или ссылка, связанная со свойством. Затем описывается свойство:

тип имя-свойства

{

set

{

код реализации set, использующий параметр value и переменную

или ссылку свойства

}

get

{

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

свойства

}

}

C++/CLI. В управляемом классе объявляется закрытая переменная или закрытый дескриптор свойства. Потом описывается свойство:

property тип имя-свойства

{

Void set(тип value)

{

код реализации set, использующий параметр value и переменную или ссылку

свойства

}

тип get()

{

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

}

}

Если в языке C# свойство описывается без ключевого слова property в единой конструкции, включающей в себя функции set и get и использующей ключевое слово value, то в языке C++/CLI единая конструкция с функциями set и get начинается с ключевого слова свойства property, а функции set и get описываются с возвращаемым значением и параметром. В языке C# ключевое слово value представляет значение, которое присваивается свойству.

Заметим, что при необходимости можно описать свойство только с одной функцией, если свойство только читаемо или только записываемо. И, разумеется, свойство должно иметь доступ public, иначе оно не применимо к объекту. Важно отметить, что из определения свойств явствует, что при установке или при возврате свойства в функциях set и get можно при необходимости выполнить над ними действия и, в частности, проверить вхождение значения свойства в указанный диапазон.

Если только осуществляется присвоение или возвращение значения свойства, то язык C++/CLI допускает простое определение свойства, в котором присвоение и возврат значения осуществляется автоматически.

C++/CLI.

property тип имя-свойства;

В дальнейшем, познакомившись с классами библиотеки .NET Framework, мы приятно удивимся активному использованию свойств в классах этоЙ библиотеки, и эти свойства, действительно, упростят использование объектов этих классов.

В примере 8.1.1 можно сравнить реализацию свойства на языках C++/CLI и C#.

Пример 8.1.1. Свойства в C++/CLI и C#.

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

// C++/CLI

#include "stdafx.h"

using namespace System;

ref class CPlane // Класс, содержащий описание свойства Speed

{

private:

int aSpeed; // Закрытая переменная свойства Speed

public:

// Описание свойства Speed

property int Speed

{

void set(int vProp) // Установить значение свойства

{

aSpeed= vProp;

}

int get() // Возвратить значение свойства

{return aSpeed;}

}

};

void main()

{

CPlane ^pPlane= gcnew CPlane; // Создать объект

pPlane -> Speed=600; // Присвоить значение

Console::WriteLine (pPlane -> Speed); // Получить значение и выдать

Console::ReadKey();

}

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

//C#

using System;

class CPlane // Класс, содержащий описание свойства Speed

{

private int aSpeed; // Закрытая переменная свойства Speed

public int Speed // Описание свойства Speed

{

set{ aSpeed= value;} // Установить значение свойства

get{ return aSpeed;} // Возвратить значение свойства

}

}

class Program

{

static void Main(string[] args)

{

CPlane sPlane= new CPlane(); // Создать объект

sPlane.Speed= 600; // Присвоить значение

Console.WriteLine (sPlane.Speed); // Получить значение и выдать

Console.ReadKey();

}

}

Достоинством свойств является то, что их можно применять в выражениях, например:

sPlane.Speed= sPlane.Speed * 2; // C#

Java. В языке Java свойства можно представить состоящими из закрытой переменной свойства и двух функций. Одна из функций, имя которой начинается со слова set с последующим именем свойства, устанавливает значение свойства, а другая, имя которой начинается со слова get с последующим именем свойства, возвращает значение свойства. Пример 8.1.2 иллюстрирует реализацию свойства Speed на языке Java.