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

1.4.14Свойства

См. проект CLI_Review.

//////////////// Простейшее определение свойства

value class P1

{

public: property int X;

};

void TrivialProperty()

{

P1 p;

Console::WriteLine(" Значение P1's X равно {0}", p.X);

p.X = 42;

Console::WriteLine(" А теперь значение P1's X равно {0}",

p.X);

}

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

value class P2

{

int MyX; // хранилище значения свойства Х

public:

property int X

{

int get()

{

Console::WriteLine(" Получение значения P2's X равно"

" ({0})", MyX);

return MyX;

}

void set(int value)

{

Console::WriteLine(" Изменение значения P2's X равно"

" ({0})", value);

MyX = value;

}

}

};

void ReadWriteProperty()

{

P2 p;

p.X = 42;

p.X = p.X + 1;

}

/////////////////////// Свойство только для чтения

value class P3

{

int MyX;

public:

P3(int value) : MyX(value) {}

property int X

{

int get() { return MyX; }

}

};

void ReadOnlyProperty()

{

P3 p(42);

Console::WriteLine(" Значение свойства P3's X равно {0}", p.X);

}

//////////////////// Пример простого индексированного свойства

ref class SProp

{

public:

property String^ Numeral[int]

{

String ^ get(int Num)

{

switch(Num)

{

case 0: return "Нуль";

case 1: return "Один";

case 2: return "Два";

default: return "Много";

}

}

}

};

Void SimpleIndexProp()

{

SProp ^obj=gcnew SProp;

Console::WriteLine(obj->Numeral[0]); // Нуль

Console::WriteLine(obj->Numeral[10]); // Много

}

//////////////// Индексированное свойство (пример со списком)

Value class p4

{

ref class LinkList

{

public:

LinkList(int key, int value) : Key(key), Value(value) {}

int Key;

Int Value;

LinkList^ NextNode;

};

LinkList^ Root;

public:

property int Map[int]

{

int get(int x)

{

LinkList^ current = Root;

while (current)

{

if (x == current->Key)

{

Console::WriteLine(" P4 отображает {0} в {1}",

current->Key, current->Value);

return current->Value;

}

current = current->NextNode;

}

Console::WriteLine(" P4 не отображает {0} ни к чему", x);

throw gcnew InvalidOperationException;

} // int get(int x)

Void set(int X, int value)

{

Console::WriteLine(" P4 отображает {0} в {1}", x, value);

if (Root == nullptr)

{

Root = gcnew LinkList(x, value);

return;

}

LinkList^ current = Root;

while ((current->NextNode != nullptr) &&

(current->Key != x))

{

current = current->NextNode;

}

if (current->Key == x)

{

current->Value = value;

return;

}

current->NextNode = gcnew LinkList(x, value);

} // void set(int x, int value)

}// property int Map[int]

};