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

Java и j#

имя-порожд-констр (список-парам)

{ super (список-арг); . . . }

Обратим внимание, что список инициализации для C++/CLI состоит из имён конструкторов базовых классов со списком аргументов в круглых скобках, отделённых друг от друга запятыми. В случае управляемых классов применимо только одно имя базового класса, поскольку управляемые классы наследуют единственный базовый класс. Для языка C# список инициализации состоит из ключевого слова base, за которым указан список аргументов в круглых скобках.

При создании объектов порождённого класса порядок выполнения конструкторов следующий. Сначала выполняется конструктор базового класса.

Затем выполняются конструкторы объектов, создаваемых в теле порождённого конструктора. И, наконец, выполняется конструктор порождённого класса.

В языке Java вызов конструктора базового класса осуществляется в начале тела порождённого класса. Конструктор представляется в видс ключевого слова super, за которым в круглых скобках указывается список аргументов.

Java и j#

имя-порожд-констр (список-парам)

{ вирег(список-аргументов); тело конструктора }

В программах примера 6.4.1 выполняются разные конструкторы при создании объекта порождённого класса.

Пример 6.4.1. Выполнение конструкторов.

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

// C++/CLI

#include "stdafx.h"

using namespace System;

class CA // Класс для объекта, создаваемого конструктором класса CB

{

Int X; // Закрытая переменная X

public:

CA(int x) {CA::x= x;} // Конструктор класса CA

Int Get() {return X;} // Получить значение X

};

class CB // Базовый класс для класса CC

{

CA *pA; // Указатель на объект класса CA

public:

CB(int x) {pA= new CA (x);} // Конструктор класса CB

int Get() {return pA->Get();} // Получить значение переменной x

// объекта класса CA

};

class CC: public CB // Класс, порождённый из базового класса CB

{

char y; // Закрытая переменная у

public:

CC(int x, int y): CB(x) // Конструктор со списком инициализации

{CC::y=y;}

void Get(int &x, char &y) {x=CB::Get(); y=CC::y;} // Получить x и у

};

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

{

CC *pCC= new CC(5,'a'); // Создать объект класса CC в куче

int x;

char y;

pCC->Get(x,y); // Получить значения x и у

Console::WriteLine (x); // Вывести значение x

Console::WriteLine (Char(y)); // Вывести значение у

}

Результат:

5

а

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

// Java и J#

class CA // Класс для объекта, создаваемого конструктором класса CB

{

private int x; // Закрытая переменная x

public CA(int yx) {x= yx;} // Конструктор класса CA

public int Get ( ) {return x;} // Получить значение x

}

class CB // Базовый класс для класса CC

{

private CA sA; // Ссылка на объект класса CA

public CB (int x) {sA= new CA (x);} // Конструктор класса CB

public int Get ( ) {return sA.Get();} // Получить значение переменной x

// объекта класса CA >

}

class Data

{

public int x;

public char y;

}

class CC extends CB // Класс, порождённый из базового класса CB

{

private char y; // Закрытая переменная у

public CC (int x, char my) // Конструктор с инициализацией

{super (x); y= my;}

public CC (Data d) // Конструктор с инициализацией

{super (d.x); y=d.y;}

public void Get(Data d){d.x=super.Get(); d.y=y;} //Получить

}

public class Test

{

public static void main(String[] args)

{

CC sCC= new CC (5, 'a'); // Создать объект класса CC в куче

Data d= new Data(); d.x= 0; d.y= 'm';

sCC.Get(d);// Получить значения x и у

System.out.println (d.x); // Вывести значение x

System.out.println (d.y); // Вывести значение у

}

}

Результат:

5

а

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

// C#

using System;

class CA // Класс для объекта, создаваемого конструктором класса CB

{

private int x; // Закрытая переменная x

public CA(int vx) { x = vx; } // Конструктор класса C4

public int Get() { return x; } // Получить значение x

}

class CB // Базовый класс для класса CC

{

private CA sA; // Ссылка на объект класса CA

public CB (int x) {sA= new CA (x);} // Конструктор класса CB

public int Get () {return sA.Get();} // Получить значение переменной x

// объекта класса CA

}

class CC: CB // Класс, порождённый из базового класса CB

{

private char y; // Закрытая переменная у

public CC (int x, char my): base (x) // Конструктор со списком инициализации

{y= my;}

public void Get (ref int x, ref char my) {x= base.Get(); my= y;} // Получить

}

class Program

{

static void Main(string[] args)

{

CC sCC= new CC (5, 'a'); // Создать объект класса CC в куче

int x= 0;

char y='m';

sCC.Get(ref x,ref y);

Console.WriteLine(x);

Console.WriteLine(y);

}

}

Результат:

5

а

Java и J#. В языке Java данные стандартных типов передаются в параметрах функции по значению (через стек). Поэтому их изменённые в теле функции значения не возвращаются через аргументы этой функции. Если появилась необходимость возврата каких либо значений через параметры функции, то в качестве параметров необходимо применить только ссылаемые данные, такие как массив и объекты, которые размещены не в стеке, а в управляемой куче. Обратите внимание, что в Java программе примера 6.4.1 в конструкторе CC() и в функции Get() в качестве параметра применена ссылка на объект типа Data, используемый только для извлечения данных x и у.