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

6.6.2Базовые интерфейсы

Часто разнотипные объекты (то есть объекты, созданные из разных классов) обязаны включать в свой интерфейс среди функций, свойств и событий одну и ту же совокупность функций, свойств и событий. Эти дополнительные и обязательные функции, свойства и события обычно образуются из так называемого базового интерфейса, который наследовал класс каждого из этих объектов. Базовые интерфейсы обязывают разнотипные объекты соблюдать одни и те же правила поведения.

Базовые интерфейсы широко применяются при разработке компонентов, поскольку именно базовые интерфейсы обязывают компонент соблюдать рекомендации компонентно-ориентированного программирования, включать обязательные функции, свойства и события. Среди функций базового интерфейса есть, например, функция Dispose(), обязывающая объект компонента освободить используемые им ресурсы перед его уничтожением.

6.7 Упаковка и распаковка типов данных

C#. В языке C# любой класс и все типы данных, включая обычные типы (как int, float и др.), наследуются из класса Object пространства имён System. Поэтому любой класс может воспользоваться открытыми функциями класса Object, в частности, функцией ToString(). При желании эта функция может быть переопределена (override) в классе, отображая нужное содержание объекта класса. Для обычного типа данных эта функция представляет его значение в виде строки, что, например, используется функциями Write() и WriteLine().

Наличие общего базового класса System.Object позволяет использовать ссылочную переменную типа Object при ссылке на объект любого другого класса, включая массив, поскольку массивы реализованы в C# как классы.

С++ /CLI. В языке C++/CLI только классы библиотеки .NET Framework и управляемые классы наследуются из класса System::Object. Также из этого класса наследуются классы, полученные путём упаковки из типов значений.

Упаковка состоит в применении к типу-значение специального управляемого класса-оболочки, который обволакивает тип значения, превращая его в управляемый объект. Этот класс наследует класс System::Object, а объект этого класса размещается в управляемой куче. К объекту можно применить любую открытую функцию класса System::Object и, в частности, ToString().

Распаковка состоит в преобразовании упакованного типа, хранимого в управляемой куче, в неупакованное значение, хранимое в стеке. При распаковке осуществляется разыменование дескриптора с использованием "*".

В примере 6.7.1 приведено использование класса object (краткое имя для System::Object) для упаковки и распаковки в C#, класса-оболочки Int32 для C++/CLI и класса-оболочки Integer для Java.

Пример 6.7.1. Упаковка и распаковка типов значений.

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

// C++/CLI

#include "stdafx.h"

using namespace System;

Int main() // Главная статическая функция main()

{

int x= 20; // Целочисленное значение в стеке

Console::WriteLine(x);

Int32 ^pX= gcnew Int32 (x); // Упаковка значения в управляемую кучу

int y= *pX; // Распаковка (разыменование) в стек

Console::WriteLine (y);

return 0;

}

Результат:

20

20

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

// Java и J#

public class Test

{

public static void main(String[] args)

{

int x= 20; // Целочисленное значение в стеке

System.out.println (x);

Integer objI= new Integer(x); // Упаковка в управляемую кучу

int y= objI.intValue(); // Распаковка в стек

System.out.println (y);

boolean b= true; // Булевское значение в стеке

System.out.println (b);

Boolean objB= new Boolean(b); // Упаковка в управляемую кучу

boolean c= objB.booleanValue(); // Распаковка в стек

System.out.println (c);

}

}

Результат:

20

20

true

true

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

//C#

using System;

class Program

{

static void Main(string[] args)

{

int x= 20; // Целочисленное значение в стеке

Console.WriteLine(x);

object obj; // Объект класса System.Object

obj= x; // Упаковка в управляемую кучу

x= 500;

int y= (int) obj; // Распаковка в стек

Console.WriteLine(y);

System.Object objS; // Объект класса System.Object

objS= x; // Упаковка в управляемую кучу

int yS= (int) objS; // Распаковка в стек

Console.WriteLine(yS);

}

}

Результат:

20

20

500

C#. Обратите внимание, после упаковки целочисленного значения x, равного 20, в управляемую кучу, значение x изменено на 500. Но распакованное значение равно 20. Таким образом, переменная x и ссылка obj указывают на разные места хранения данных (стек и управляемая куча). Целочисленное данное, действительно, боксировалось.

Java. В языке Java для обёртки базовых типов данных применяются специальные классы Boolean, Character, Integer, Long, Float, Double и функции booleanValue(), charValue(), intValue(), longValue(), floatValue(), doubleValue().