Какое свойство строит иерархию объектов
1. (60c.) Какое из имен используется для задания текста процедур, функций, методов?
(один ответ)
1) LABEL
2) INTERFACE
3) IMPLEMENTATION
4) VAR
2. (60c.) Какая из операций используется для указания остатка?
(один ответ)
1) DIV
2) MOD
3) {$
4) ^
3. Какая из операций используется для указания директив компиллятора?
(один ответ)
1) DIV
2) MOD
3) {$
4) ^
5. (60c.) Какой из типов данных относится к действительным числам?
( один ответ)
1) BOOLEAN
2) CHAR
3) SINGLE
4) CARDINAL
6. (60c.) Какое из описаний типов относится к записи?
( один ответ)
1) Ww=function(X:real):real;
2) Ww=record x,y:real; end;
3) Ww=’a’..’z’
4) Ww=array[1..10] of real;
7. (60c.) Какое из названий обозначает описание типа записи?
( один ответ)
1) property
2) Ww=record x,y:real; end;
3) constructor
4) destructor
8. (60c.) Какое из свойств объекта относится к графическому изображению?
( один ответ)
1) hint
2) set focus
3) canvas
4) items
9. (60c.) Какое из свойств объекта относится к списку строк?
( один ответ)
1) hint
2) set focus
3) canvas
4) items
10. (60c.) Какая из процедур используется для открытия файла для чтения из него?
( один ответ)
1) AssignFile
2) Reset
3) Rewrite
4) Append
11. (60c.) Какая из процедур используется для открытия файла для дозаписи в конец файла?
( один ответ)
1) AssignFile
2) Reset
3) Rewrite
4) Append
12. (60c.) Какая из операций обозначает получение адреса?
(один ответ)
1) @
2) +
3) ^
4) *
13. (60c.) Какая из операций используется при описании типа указателя?
(один ответ)
1) @
2) +
3) ^
4) *
14. (60c.) Какая связка операторов обозначает цикл c выходом по условию?
(один ответ)
1) For…to…do
2) If…then…else
3) Case…of… end
4) While…do
1 5. (60c.) Какая связка операторов дает выбор из 3-х и более вариантов?
(один ответ)
1) For…to…do
2) If…then…else
3) Case…of… end
4) While…do
1 6. (60c.) Какая из процедур имеет только типизированные параметры-переменные?
( один ответ)
1) procedure si(var x,y:real);
2) procedure si(x,y:real);
3) procedure si(var x,y) ;
4) procedure si(x:real;var y):real;
17. (60c.) Укажите правильное описание переменной строкового типа.
( один ответ)
1) a:array[1..10] of real;
2) a:string[10];
3) a:set of (1,10);
4) a:record n:real; f:real; end;
18. (60c.) Какой из терминов обозначает окно модуля формы?
( один ответ)
1) Object Inspector
2) Database Desktop
3) Paradox
4) Unit
19. (60c.) Какой из терминов обозначает свойство заголовка объекта?
( один ответ)
1) Canvas
2) Events
3) Caption
4) Enabled
20. (60c.) Какой из терминов обозначает свойство логического типа?
( один ответ)
1) Canvas
2) Events
3) AlClient
4) Enabled
21. (60c.) Какая из структур имеет нумерацию элементов?
(один ответ)
1) Очередь
2) Стек
3) Двусвязный список
4) Массив
22. (60c.) Вызов функцией самой себя это -…
(один ответ)
1) Рекурсия
2) Итерация
3) Процедура
4) Динамическая структура
23. (60c.) Какое расширение имеют файлы модулей в DELPHI?
(один ответ)
1) *.exe
2) *.com
3) *.dpr
4) *.pas
24. (60c.) Какое из свойств использует виртуальные или перегружаемые элементы?
(один ответ)
1) Инкапсуляция
2) Полиморфизм
3) Наследование
4) Объектно-Ориентированные
25. (60c.) Какое из имен используется как заголовок файла проекта?
(один ответ)
1) PROGRAM
2) USES
3) UNIT
4) TYPE
26. (60c.) Какое из имен используется для описания классов проекта или модуля?
(один ответ)
1) PROGRAM
2) USES
3) UNIT
4) TYPE
27. (60c.) Какой из терминов обозначает окно модуля формы?
( один ответ)
1) Object Inspector
2) Database Desktop
3) Paradox
4) Unit
28. (60c.) Какой из терминов обозначает свойство заголовка объекта?
( один ответ)
1) Canvas
2) Events
3) Caption
4) Enabled
29. (60c.) Какой из терминов обозначает свойство логического типа?
( один ответ)
1) Canvas
2) Events
3) AlClient
4) Enabled
30. (60c.) Какой из терминов обозначает константу для свойства размещения?
( один ответ)
1) Canvas
2) LineTo
3) AlClient
4) Enabled
31. (60c.) Какое из свойств обозначает выбор шрифта?
( один ответ)
1) Font
2) Pen
3) Image
4) Alias
32. (60c.) Какое из свойств скрывает внутренние данные объекта?
(один ответ)
1) Инкапсуляция
2) Полиморфизм
3) Наследование
4) Объектно-Ориентированные
33. (60c.) Какое из свойств предназначено для улучшения интерфейса работы с объектами?
(один ответ)
1) Инкапсуляция
2) Полиморфизм
3) Наследование
4) Визуальность
34. (60c.) Какая из операций используется для указания директив компилятора?
(один ответ)
1) DIV
2) MOD
3) {$
4) ^
35. (60c.) Какая из операций используется для определения указателя?
(один ответ)
1) DIV
2) MOD
3) {$
4) ^
36. (60c.) Какая из операций обозначает получение адреса?
(один ответ)
1) @
2) +
3) ^
4) *
37. (60c.) Какая из структур имеет нумерацию элементов?
(один ответ)
1) Очередь
2) Стек
3) Двусвязный список
4) Массив
38. (60c.) Какое из названий обозначает доступные только потомкам элементы класса?
(один ответ)
1) public
2) published
3) protected
4) private
39. (60c.) Какое из разделов класса выбирается по умолчанию?
(один ответ)
1) public
2) published
3) protected
4) private
40. (60c.) Какое из свойств не является принципом объектно ориентированного программирования?
(один ответ)
1) Инкапсуляция
2) Полиморфизм
3) Наследование
4) Визуальность
41. (60c.) Какое из свойств определяет скрытие полей объектов?
(один ответ)
1) Инкапсуляция
2) Полиморфизм
3) Наследование
4) Визуальность
42. (60c.) Какое из свойств может быть связано с переопределением методов объектами?
(один ответ)
1) Инкапсуляция
2) Полиморфизм
3) Наследование
4) Визуальность
43. (60c.) Какое из свойств предназначено для передачи всех свойств от класса к классу?
(один ответ)
1) Инкапсуляция
2) Полиморфизм
3) Наследование
4) Визуальность
44. (60c.) Какой из терминов может относиться к термину OnClick?
(один ответ)
1) Конструктор
2) Деструктор
3) Свойство
4) Событие
Комментарий модератора | ||
|
Комментарий модератора | ||
|
Источник
Аннотация: Описание потомков объекта. Наследование полей и методов. Раннее и
позднее связывание. Механизм виртуальных методов. Конструкторы и деструкторы.
Размещение объектов в динамической памяти. Полиморфные объекты. Контейнер
(список) полиморфных объектов.
Наследование
Презентацию к данной работе Вы можете скачать здесь.
Управлять большим количеством разрозненных объектов достаточно сложно. С этой проблемой можно справиться путем упорядочивания и ранжирования объектов, то есть объединяя общие для нескольких объектов свойства в одном объекте и используя этот объект в качестве базового.
Эту возможность предоставляет механизм наследования. Он позволяет строить иерархии, в которых объекты-потомки получают свойства объектов-предков и могут дополнять их или изменять. Таким образом, наследование обеспечивает возможность повторного использования кода.
Объекты, расположенные ближе к началу иерархии, объединяют в себе наиболее общие черты для всех нижележащих объектов. По мере продвижения вниз по иерархии объекты приобретают все больше конкретных особенностей.
Объект в Паскале может иметь произвольное количество потомков и только одного предка. При описании объекта имя его предка записывается в круглых скобках после ключевого слова object.
Допустим, нам требуется ввести в игру еще один тип персонажей, который должен обладать свойствами объекта monster, но по-другому выглядеть и атаковать. Будет логично сделать новый объект потомком объекта monster. Проанализировав код методов этого объекта, переопределим только те, которые реализуются по-другому (
пример
7.1).
procedure init(x_, y_, health_, ammo_, magic_ : word);
procedure attack;
procedure draw;
procedure erase;
procedure wizardry;
private
magic : word;
end;
{ ————————- реализация методов объекта daemon —————– }
procedure daemon.init(x_, y_, health_, ammo_, magic_ : word);
begin
inherited init(x_, y_, health_, ammo_);
color := green;
magic := magic_;
end;
procedure daemon.attack; { ——————————— daemon.attack —- }
begin
if ammo = 0 then exit;
dec(ammo);
if magic > 0 then begin
outtextXY(x + 15, y, ‘БУ-БУХ!’); dec(magic); end
else
outtextXY(x + 15, y, ‘бу-бух!’);
end;
procedure daemon.draw; { ———————————– daemon.draw —- }
begin
setcolor(color); outtextXY(x, y, ‘%)’);
end;
procedure daemon.erase; { ———————————– daemon.erase —- }
begin
setcolor(black); outtextXY(x, y, ‘%)’);
end;
procedure daemon.wizardry; { ——————————– daemon.wizardry – }
begin
if magic = 0 then exit;
outtextXY(x + 15, y, ‘крибле-крабле-бумс!’); dec(magic);
end;
Листинг
7.1.
Переопределение методов после добавления нового типа персонажей
Наследование полей.Унаследованные поля доступны в объекте точно так же, как и его собственные. Изменить или удалить поле при наследовании нельзя.Объект daemon содержит все поля своего предка и одно собственное поле magic, в котором хранится “магическая сила” объекта.
Наследование методов.В потомке объекта можно не только описывать новые методы, но и переопределять существующие. Метод можно переопределить либо полностью, либо дополнив метод предка.
В объекте daemon описан новый метод wizardry, с помощью которого объект применяет свою магическую силу, а метод инициализации init переопределен, потому что количество полей объекта изменилось. Однако необходимость задавать значения унаследованным полям осталась, и соответствующий метод есть в объекте monster, поэтому из нового метода инициализации сначала вызывается старый, а затем выполняются дополнительные действия (присваивание значения полю ammo ).
Вызов метода предка из метода потомка выполняется с помощью ключевого слова inherited (унаследованный). Можно вызвать метод предка и явным образом с помощью конструкции monster.init.
Методы отрисовки draw и erase также переопределены, потому что изображение демона отличается от изображения монстра и, следовательно, формируется другой последовательностью подпрограмм (для простоты представим демона в виде “смайлика”).
Переопределен и метод attack: теперь атака выполняется по-разному в зависимости от наличия магической силы.
Чтобы перемещать демона, требуется выполнить те же действия, что записаны в методе move для перемещения монстра: необходимо стереть его изображение на старом месте, обновить координаты и нарисовать на новом месте. На первый взгляд, можно без проблем унаследовать этот метод, а также метод hit. Так мы и поступим.
Добавим описание объекта daemon в интерфейсную часть модуля monsters, а тексты его методов — в раздел реализации. Проверим работу новых методов с помощью программы:
uses graph, crt, monsters;
var Vasia : daemon;
gd, gm : integer;
begin
gd := detect; initgraph(gd, gm, ‘…’);
if graphresult <> grOk then begin
writeln(‘ошибка инициализации графики’); exit end;
Vasia.init(100, 100, 20, 10, 6);
Vasia.draw; Vasia.attack;
readln;
Vasia.erase;
readln;
end.
И в предке, и в потомке есть одноименные методы. Вызывается всегда тот метод,
который соответствует типу объекта, потому что при вызове указывается
имя экземпляра заданного типа (
рис.
7.1). Это можно
рассматривать как простейший вид полиморфизма.
Рис.
7.1.
Раннее связывание
Источник
Иерархия объектов очень удобна когда нам нужно задать какие-то трансформации объектов не относительно начала координат, а относительно друг-друга. Например, если создать иерархию из двух объектов: рука и туловище, то для того, что бы рука двигалась вместе с туловищем, нам не надо будет прилагать каких-либо усилий – при движении туловища трансформации всех объектов в иерархии (в нашем случае рука) будут пересчитаны в соответствии с движением объектов привязки (в нашем случае туловища), но при этом сами объекты могут трансформироваться относительно своего “предка” в иерархии. Чаще всего иерархии объектов применяются для создания и анимации механизированных агрегатов, таких как “механические руки”, подъёмные краны, двери (да-да, двери это наиболее частое применение иерархий объектов), разного рода выдвигающиеся откуда-то лестницы и многое другое. Все эти элементы игрового мира в большинстве случаев реализованы именно иерархиями объектов.
Реализация иерархии объектов
Реализация иерархии объектов достаточно проста. По большей части всё, что нам нужно сделать, это реализовать механизм наследования трансформаций от одного объекта к другому (или нескольким). Для этого каждый объект должен иметь собственную матрицу трансформации и, если для него задан “родительский” объект, он должен так же наследовать трансформацию согласно иерархии от этого родительского объекта. Для этого я дслелал отдельный класс, который назвал CEntity. Этот класс содержит в себе только информацию о положении и трансформации объекта (т.е. матрицу трансформации – она задаёт и положение и трансформацию), а так же информацию о “предке”, от которого, по иерархии, будут наследоваться трансформации объектов:
class CEntity
{
private:
CEntity* m_pParent;
D3DXMATRIXA16 m_matrix;
public:
CEntity(void);
virtual ~CEntity(void);
const D3DXMATRIX GetMatrix() const;
D3DXVECTOR3 GetPos() const;
void SetMatrix(const D3DXMATRIX& mat);
void SetRotation(const D3DXMATRIX& mat);
void SetPos(const D3DXVECTOR3& pos);
void SetParent(CEntity* pParent);
};
Как видите, тут нет ничего, кроме предка и матрицы трансформации, а та же всего нескольких функций, которые позволяют задать текущие трансформации и/или получить их.
Иерархии объектов из 3д-моделей
Для задания иерархий моделей я сделал отдельный класс. Сделал я это потому как считаю, что такие элементы, как иерархические модели, используются достаточно часто и такой код поможет нам в будущем сэкономить ещё немного времени на том, что мы не будем постоянно писать один и тот же код для разных иерархий и моделей:
class CEntityModel :
public CEntity
{
private:
CMeshPtr m_pMesh;
public:
CEntityModel(const std::string& strFileName=””);
virtual ~CEntityModel(void);
bool SetModel(const std::string& strFileName);
void ReleaseModel();
CMeshPtr GetMesh() const;
};
Наследования трансформаций в иерархии объектов
Само наследование трансформаций внутри иерархии объектов так же делается элементрно. Реализован этот функционал в одной из функций представленного выше класса:
{
if (!m_pParent)
{
return m_matrix;
}
D3DXMATRIXA16 m = m_pParent->GetMatrix();
D3DXMatrixMultiply(&m, &m_matrix, &m);
return m;
}
Как видите, всё гениальное просто )))
Хочу заметить, что в данный момент я не ставлю перед собой цели как-то оптимизировать код – для наших с Вами целей быстродействие нашей программы и так будет более, чем достаточным.
Настройка иерархии объектов
Я не стал изголяться с конфигами и прочим и задал саму иерархию и зависимости объектов в самой программе – наш пример программы достаточно простой, потому сделать это оказалось совсем не сложно – я просто указал для каждого их объектов его положение (относительно предка) и задал самих предков ещё на этапе инициализации приложения:
m_modelMiddle.SetModel(“Data/middle.GAMEMODEL”);
m_modelBottom.SetModel(“Data/bottom.GAMEMODEL”);
m_modelTop.SetPos(D3DXVECTOR3(0, 16, 0));
m_modelMiddle.SetPos(D3DXVECTOR3(0, 15, 0));
m_modelBottom.SetPos(D3DXVECTOR3(0, 0, 0));
m_modelMiddle.SetParent(&m_modelBottom);
m_modelTop.SetParent(&m_modelMiddle);
Анимация иерархических объектов
Поскольку внутри иерархии объекты наследуют трансформации, анимировать иерархии получается очень просто, даже проще, чем можно было себе представить… Тем более, что как раз для апдейта сцены у нас в классе CGameApplication предусмотрена отдельная функция под названием UpdateFrame(), то как раз её я и использовал:
{
D3DXMATRIX m;
static float a=0.0f;
a+=.03f;
D3DXMatrixRotationZ(&m, -cos(a) + cos(a*3)*.2f);
m_modelTop.SetRotation(m);
D3DXMatrixRotationZ(&m, cos(a));
m_modelMiddle.SetRotation(m);
}
После чего всё заработало само-собой…
На этом я пока хочу закончить с разговором о иерархиях объектов. Думаю, исходный код, а так же готовая дема, помогут Вам разобраться что к чему. Если же нет – я, как обычно, жду ваших комментариев и постараюсь объяснить все непонятные или плохо мной раскрытые моменты…
Ещё по этой теме:
Источник
Аннотация: Описание потомков объекта. Наследование полей и методов. Раннее и
позднее связывание. Механизм виртуальных методов. Конструкторы и деструкторы.
Размещение объектов в динамической памяти. Полиморфные объекты. Контейнер
(список) полиморфных объектов.
Наследование
Презентацию к данной работе Вы можете скачать здесь.
Управлять большим количеством разрозненных объектов достаточно сложно. С этой проблемой можно справиться путем упорядочивания и ранжирования объектов, то есть объединяя общие для нескольких объектов свойства в одном объекте и используя этот объект в качестве базового.
Эту возможность предоставляет механизм наследования. Он позволяет строить иерархии, в которых объекты-потомки получают свойства объектов-предков и могут дополнять их или изменять. Таким образом, наследование обеспечивает возможность повторного использования кода.
Объекты, расположенные ближе к началу иерархии, объединяют в себе наиболее общие черты для всех нижележащих объектов. По мере продвижения вниз по иерархии объекты приобретают все больше конкретных особенностей.
Объект в Паскале может иметь произвольное количество потомков и только одного предка. При описании объекта имя его предка записывается в круглых скобках после ключевого слова object.
Допустим, нам требуется ввести в игру еще один тип персонажей, который должен обладать свойствами объекта monster, но по-другому выглядеть и атаковать. Будет логично сделать новый объект потомком объекта monster. Проанализировав код методов этого объекта, переопределим только те, которые реализуются по-другому (
пример
7.1).
procedure init(x_, y_, health_, ammo_, magic_ : word);
procedure attack;
procedure draw;
procedure erase;
procedure wizardry;
private
magic : word;
end;
{ ————————- реализация методов объекта daemon —————– }
procedure daemon.init(x_, y_, health_, ammo_, magic_ : word);
begin
inherited init(x_, y_, health_, ammo_);
color := green;
magic := magic_;
end;
procedure daemon.attack; { ——————————— daemon.attack —- }
begin
if ammo = 0 then exit;
dec(ammo);
if magic > 0 then begin
outtextXY(x + 15, y, ‘БУ-БУХ!’); dec(magic); end
else
outtextXY(x + 15, y, ‘бу-бух!’);
end;
procedure daemon.draw; { ———————————– daemon.draw —- }
begin
setcolor(color); outtextXY(x, y, ‘%)’);
end;
procedure daemon.erase; { ———————————– daemon.erase —- }
begin
setcolor(black); outtextXY(x, y, ‘%)’);
end;
procedure daemon.wizardry; { ——————————– daemon.wizardry – }
begin
if magic = 0 then exit;
outtextXY(x + 15, y, ‘крибле-крабле-бумс!’); dec(magic);
end;
Листинг
7.1.
Переопределение методов после добавления нового типа персонажей
Наследование полей.Унаследованные поля доступны в объекте точно так же, как и его собственные. Изменить или удалить поле при наследовании нельзя.Объект daemon содержит все поля своего предка и одно собственное поле magic, в котором хранится “магическая сила” объекта.
Наследование методов.В потомке объекта можно не только описывать новые методы, но и переопределять существующие. Метод можно переопределить либо полностью, либо дополнив метод предка.
В объекте daemon описан новый метод wizardry, с помощью которого объект применяет свою магическую силу, а метод инициализации init переопределен, потому что количество полей объекта изменилось. Однако необходимость задавать значения унаследованным полям осталась, и соответствующий метод есть в объекте monster, поэтому из нового метода инициализации сначала вызывается старый, а затем выполняются дополнительные действия (присваивание значения полю ammo ).
Вызов метода предка из метода потомка выполняется с помощью ключевого слова inherited (унаследованный). Можно вызвать метод предка и явным образом с помощью конструкции monster.init.
Методы отрисовки draw и erase также переопределены, потому что изображение демона отличается от изображения монстра и, следовательно, формируется другой последовательностью подпрограмм (для простоты представим демона в виде “смайлика”).
Переопределен и метод attack: теперь атака выполняется по-разному в зависимости от наличия магической силы.
Чтобы перемещать демона, требуется выполнить те же действия, что записаны в методе move для перемещения монстра: необходимо стереть его изображение на старом месте, обновить координаты и нарисовать на новом месте. На первый взгляд, можно без проблем унаследовать этот метод, а также метод hit. Так мы и поступим.
Добавим описание объекта daemon в интерфейсную часть модуля monsters, а тексты его методов — в раздел реализации. Проверим работу новых методов с помощью программы:
uses graph, crt, monsters;
var Vasia : daemon;
gd, gm : integer;
begin
gd := detect; initgraph(gd, gm, ‘…’);
if graphresult <> grOk then begin
writeln(‘ошибка инициализации графики’); exit end;
Vasia.init(100, 100, 20, 10, 6);
Vasia.draw; Vasia.attack;
readln;
Vasia.erase;
readln;
end.
И в предке, и в потомке есть одноименные методы. Вызывается всегда тот метод,
который соответствует типу объекта, потому что при вызове указывается
имя экземпляра заданного типа (
рис.
7.1). Это можно
рассматривать как простейший вид полиморфизма.
Рис.
7.1.
Раннее связывание
Источник