-
> Под "некоторым классом" ведь можно понимать и декларацию > вида class of .. и декларацию вида class(..)
Едва ли по-русски первую можно так назвать. Типом классовой ссылки или метаклассом, но не просто "некоторым классом"... Другое дело, что про идентификатор типа TSomeClass, если провести аналогию с TObject/TClass, TPersistent/TPersistentClass можно подумать, что это классовая ссылка. Ну, можно назвать идентификатор TSomeObject, или как модно TBar/TFoo. Но все эти придирки ИМХО притянуты за уши, особенно учитывая тот факт, что тесты эти для себя и нигде их результаты не фиксируются. Ну, если вдруг кто-то ответит 2 из соображений, что TSomeClass - это метакласс, то пусть считает, что ответил правильно :) Я вот тоже на один вопрос формально промахнулся (про ShowMessage в статическом методе несозданного экземпляра), но неформально себе правильный ответ засчитал :-D
-
> Юрий Зотов © (25.11.08 15:56) [96]
Т.е. 3-й ответ будет единственно и безусловно верным при условии, что вопрос будет звучать так:
Что нужно сделать, чтобы создать экземпляр этого класса, если на момент создания переменная А не инциализирована ?
-
> Ins © (25.11.08 16:35) [100]
> Едва ли по-русски первую можно так назвать
А даже если так, то все равно в вопросе должно быть явно оговорено, что A на момент создания экз-ра не содержит корректной ссылки на ранее созданный объект.
Иначе ответы 2 и 3 будут верными.
-
> Что нужно сделать, чтобы создать экземпляр этого класса, > если на момент создания переменная А не инциализирована > ?
А что значит "не инициализирована"? Имеет неопределенное значение (или nil)? Если да, то как значение этой переменной до вызова влияет на то, как нужно создавать экземпляр класса? Или под этим понимается тот факт, что не был осуществлен вызов A := TSomeClass.NewInstance; Так в этом случае второй вариант тоже не подходит, так как вызов Create в данном случае не создает экземпляр класса.
Можно было бы сформулировать так: Что нужно сделать, чтобы создать новый экземпляр этого класса, доступный через переменную A.
-
> А даже если так, то все равно в вопросе должно быть явно > оговорено, что A на момент создания экз-ра не содержит корректной > ссылки на ранее созданный объект. > > Иначе ответы 2 и 3 будут верными.
Э - нет. :) Читаь постом выше или пост Юрия Зотова под номером 95
-
> что значит "не инициализирована"?
Имеется ввиду явно не инициализирована корректной ссылкой на заведомо существующий (где-то ранее созданный) объект класса TSomeClass.
Иными словами,
A := TSomeClass.Create; // если подобная строка фигурирует где-то ранее по ходу выполнения программы .. A.Create; // то эта демонстрирует верность ответа №2, поскольку эвивалентна строке TSomeClass.Create
-
> то эта демонстрирует верность ответа №2, поскольку эвивалентна > строке TSomeClass.Create
Не, не демонстрирует ;-) Это просто инициализация созданного ранее экземпляра, но никак не создание
-
> Ins © (25.11.08 17:05) [104]
Условия только декларации переменной для выбора однозначно верного ответа, imho, недостаточно.
Нигде в условиях не сказано, что творилось с этой переменной до вызова A.Create, значит имею полное право предположить, что переменная была ранее инициализирована корректным значением.
Что не запрещено, то разрешено)
-
> > type > TMyObjectClass = class(TObject) > .. > end; > > TSomeClass = class of TMyObjectClass; > > var > A: TSomeClass; > > .. > > A.Create;
Работает? :)
-
> Это просто инициализация созданного ранее экземпляра
Логично)
[102] снимаю.
-
У конструктора > Сергей М. © (25.11.08 16:47) [102] > А даже если так, то все равно в вопросе должно быть явно > оговорено, что A на момент создания экз-ра не содержит корректной > ссылки на ранее созданный объект. > > Иначе ответы 2 и 3 будут верными.
У конструктора два неявных параметра - Self и ещё один булевский параметр, который показывает, вызывается ли конструктор как классовый метод или как обычный метод.
В пролог конструктора вставляется код, который анализирует этот параметр. Если конструктор вызывается как классовый метод, то из пролога вызывается NewInstance, который создаёт новый экземпляр класса. Указатель на этот экземпляр помещается в Self, перетирая ссылку на класс, которая была там при вызове. Именно поэтому с самого начала Self в конструкторе содержит ссылку на объект, хотя изначально это была ссылка на класс.
Если конструктор вызывается как обычный метод (т.е. Self изначально содержит ссылку на объект, а не на класс), пролог не делает ничего дополнительного, и конструктор отрабатывает так же, как обычная процедура. Сделано это для того, чтобы из конструктора можно было вызывать унаследованный конструктор, и это не приводило бы к повторному вызову NewInstance.
Таким образом, если A - это ссылка на объект, A.Create ни при каких условиях не создаст новый экземпляр объекта, так как такой вызов будет интерпретирован компилятором как вызов конструктора в качестве обычного, а не классового метода.
Но вообще, впечатление такое, как будто некоторые люди здесь устроили конкурс на самое извращённое толкование вопросов теста :)
-
> Rouse_ © (25.11.08 17:17) [108]
А куда оно денется, если перед A.Create выполнить, скажем,
A := TSomeClass(TMyObjectClass.Create.ClassType);
-
> А куда оно денется, если перед A.Create выполнить, скажем, > > > A := TSomeClass(TMyObjectClass.Create.ClassType);
Ну вот про это в условии точно ничего небыло :)))
-
> Григорьев Антон © (25.11.08 17:20) [110]
[102] снимается с рассмотрения)
А что скажешь по поводу [4] ?
-
> Rouse_ © (25.11.08 17:22) [112]
> про это в условии точно ничего небыло
А там ничего не было кроме "объявлена переменная типа типа") Потому и возникает неоднозначность.
-
> Нигде в условиях не сказано, что творилось с этой переменной > до вызова A.Create, значит имею полное право предположить, > что переменная была ранее инициализирована корректным значением. >
А это уже софистика, не нужно доводить до абсурда :) Потому что с другой стороны, если в тексте вопроса что-то не оговорено, значит и выдумывать ничего лишнего не нужно. Все, что нужно для ответа, есть в тексте вопроса. Не согласны? ;-)
ЗЫ: И все равно, даже если пуститься в подобное словоблудие, то вызов Create как instance-метода никаким образом нельзя назвать "созданием экземпляра" ;-)
-
> Логично) > > [102] снимаю.
Принято. 115 писал раньше, чем увидел этот пост. Так что тоже снимается :)
-
> Работает? :)
Работает, даже ничего не нужно дописывать до вызова A.Create. И даже в соответствии условием создает новый экземпляр (правда тебе ссылку на него не возвращает), но см. [100] ;-)
-
> Сергей М. © (25.11.08 17:23) [113] > > > Григорьев Антон © (25.11.08 17:20) [110] > А что скажешь по поводу [4] ?
Решил, что надо сделать общий комментарий к теме, и в теме про DLL написать, что все вопросы здесь относятся к случаю, когда нет Build with run-time packages. А про пакеты, возможно, будет отдельная тема. Такой комментарий немедленно вставить не могу, для этого нужна модификация движка Квинтаны.
-
> Ins © (25.11.08 17:25) [115]
> Не согласны?
Не-а..
Т.е. угу, не согласен.
Батоношлепство в Делфи (со всеми вытекающими, что собссно и наблюдаем) цветет махровым цветом именно по той причине, что авторы такого рода "знаний" (хоть в форме тестов, хоть еще как-либо) не удосуживаются сформулировать вопросы-ответы, исключающие неоднозначность.
|