DP Delphi / Pascal  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Свойства, события и делегаты методов

Здесь мало узнать знакомое ключевое слово. Нужно проследить срок жизни данных, порядок вызовов, обработку ошибок и договор между модулями. Тест содержит 25 вопросов, включая 5 фрагментов кода, и разбирает темы: «Свойства», «Методы чтения и записи», «Указатели на методы», «Событийная модель» и «Пограничные случаи».

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: В каждом вопросе выберите один ответ из пяти. На весь тест отведено 70 минут. Код лучше сначала разобрать вручную: правильный вариант должен объяснять механизм, а не только совпадать с одним запуском.
Вопрос 1 из 25
В `PropertyDemo` сначала встречается `property Value: Integer read FValue;`, а затем `Writeln(C.Value);`. Какой вывод можно сделать только после чтения обеих строк?
PascalDelphi / Pascal · Свойства
// Проследите фактическое поведение PropertyDemo.
program PropertyDemo;
{$APPTYPE CONSOLE}
type
  TCounter = class
  private
    FValue: Integer;
  public
    property Value: Integer read FValue;
    procedure Increment;
  end;
procedure TCounter.Increment;
begin Inc(FValue); end;
var
  C: TCounter;
begin
  C := TCounter.Create;
  try
    C.Increment;
    Writeln(C.Value);
  finally C.Free; end;
end.
Вопрос 2 из 25
Какой сценарий по теме «Методы чтения и записи» отличит исправную реализацию от версии со скрытым дефектом?
Вопрос 3 из 25
Правка по теме «Указатели на методы» должна сохранить полезное поведение и убрать риск на соседнем сценарии. Какое требование она обязана выполнить?
Вопрос 4 из 25
Модуль, использующий тему «Событийная модель», передают другой команде. Какую ответственность нужно закрепить во внешнем договоре?
Вопрос 5 из 25
Какой договор одновременно учитывает необязательность события и время жизни его получателя?
Вопрос 6 из 25
Какое свойство темы «Свойства» становится решающим на граничном входе или при другом порядке действий?
Вопрос 7 из 25
Модуль, использующий тему «Методы чтения и записи», передают другой команде. Какую ответственность нужно закрепить во внешнем договоре?
Вопрос 8 из 25
Какое свойство темы «Указатели на методы» становится решающим на граничном входе или при другом порядке действий?
Вопрос 9 из 25
Для темы «Событийная модель» обычный путь и граничный путь дают разные риски. Какой вывод учитывает оба, не подменяя один другим?
Вопрос 10 из 25
Почему проверка `Assigned(OnDone)` не предотвращает ошибку после `Receiver.Free` в `EventLifetime`?
PascalDelphi / Pascal · Пограничные случаи
// Определите реальную гарантию в EventLifetime.
program EventLifetime;
{$APPTYPE CONSOLE}
type
  TNotify = procedure(Sender: TObject) of object;
  TSource = class
    OnDone: TNotify;
    procedure Finish;
  end;
  TReceiver = class
    procedure Handle(Sender: TObject);
  end;
procedure TSource.Finish;
begin
  if Assigned(OnDone) then
    OnDone(Self);
end;
procedure TReceiver.Handle(Sender: TObject);
begin Writeln('done'); end;
var
  Source: TSource;
  Receiver: TReceiver;
begin
  Source := TSource.Create;
  Receiver := TReceiver.Create;
  Source.OnDone := Receiver.Handle;
  Receiver.Free;
  try
    Source.Finish;
  finally
    Source.Free;
  end;
end.
Вопрос 11 из 25
Две реализации темы «Свойства» совпадают на обычном примере. Какое различие всё же меняет их договор?
Вопрос 12 из 25
В практическом сценарии по теме «Методы чтения и записи» меняются входные данные и порядок действий. Какой вывод остаётся корректным?
Вопрос 13 из 25
В теме «Указатели на методы» есть две независимые границы поведения. Какой внешний договор не смешивает их в одно расплывчатое правило?
Вопрос 14 из 25
Какой обработчик напечатает `Source.Change` после двух последовательных присваиваний `Source.OnChange`, и почему?
PascalDelphi / Pascal · Событийная модель
// Отделите правило языка от удачного запуска EventReplacement.
program EventReplacement;
{$APPTYPE CONSOLE}
type
  TNotify = procedure(Sender: TObject) of object;
  TSource = class
  public
    OnChange: TNotify;
    procedure Change;
  end;
  TReceiver = class
  public
    Name: string;
    procedure Handle(Sender: TObject);
  end;
procedure TSource.Change;
begin if Assigned(OnChange) then OnChange(Self); end;
procedure TReceiver.Handle(Sender: TObject);
begin Writeln(Name); end;
var
  Source: TSource;
  First, Second: TReceiver;
begin
  Source := TSource.Create;
  First := TReceiver.Create;
  Second := TReceiver.Create;
  try
    First.Name := 'first';
    Second.Name := 'second';
    Source.OnChange := First.Handle;
    Source.OnChange := Second.Handle;
    Source.Change;
  finally
    Source.Free;
    First.Free;
    Second.Free;
  end;
end.
Вопрос 15 из 25
Модуль, использующий тему «Пограничные случаи», передают другой команде. Какую ответственность нужно закрепить во внешнем договоре?
Вопрос 16 из 25
Реализацию темы «Свойства» заменяют без изменения интерфейса. Какое наблюдаемое свойство обязано сохраниться?
Вопрос 17 из 25
В теме «Методы чтения и записи» есть две независимые границы поведения. Какой внешний договор не смешивает их в одно расплывчатое правило?
Вопрос 18 из 25
Почему вызов `H(Sender)` после `R.Free` опасен, хотя переменная `H` не равна `nil`?
PascalDelphi / Pascal · Указатели на методы
// Определите реальную гарантию в MethodPointer.
program MethodPointer;
{$APPTYPE CONSOLE}
type
  TNotify = procedure(Sender: TObject) of object;
  TReceiver = class
    procedure Handle(Sender: TObject);
  end;
procedure TReceiver.Handle(Sender: TObject);
begin Writeln(Sender.ClassName); end;
var
  R: TReceiver;
  H: TNotify;
  Sender: TObject;
begin
  Sender := TObject.Create;
  try
    R := TReceiver.Create;
    H := R.Handle;
    R.Free;
    H(Sender);
  finally
    Sender.Free;
  end;
end.
Вопрос 19 из 25
Две реализации темы «Событийная модель» совпадают на обычном примере. Какое различие всё же меняет их договор?
Вопрос 20 из 25
Какой вывод о `Assigned` остаётся верным при любом порядке освобождения источника и получателя события?
Вопрос 21 из 25
Для темы «Свойства» обычный путь и граничный путь дают разные риски. Какой вывод учитывает оба, не подменяя один другим?
Вопрос 22 из 25
Что напечатает `SetterInvariant` после отклонённой попытки присвоить `-1` свойству `Limit`?
PascalDelphi / Pascal · Методы чтения и записи
// Setter проверяет инвариант до изменения поля.
program SetterInvariant;
{$APPTYPE CONSOLE}
uses System.SysUtils;
type
  TAccount = class
  private
    FLimit: Integer;
    procedure SetLimit(const Value: Integer);
  public
    property Limit: Integer read FLimit write SetLimit;
  end;
procedure TAccount.SetLimit(const Value: Integer);
begin
  if Value < 0 then
    raise EArgumentOutOfRangeException.Create('Limit');
  FLimit := Value;
end;
var
  Account: TAccount;
begin
  Account := TAccount.Create;
  try
    Account.Limit := 10;
    try
      Account.Limit := -1;
    except
      on E: EArgumentOutOfRangeException do
        Writeln(E.ClassName);
    end;
    Writeln(Account.Limit);
  finally
    Account.Free;
  end;
end.
Вопрос 23 из 25
Обычный пример по теме «Указатели на методы» проходит, но после изменения состояния возникает дефект. Какое условие объясняет его источник?
Вопрос 24 из 25
Реализацию темы «Событийная модель» заменяют без изменения интерфейса. Какое наблюдаемое свойство обязано сохраниться?
Вопрос 25 из 25
Какое свойство темы «Пограничные случаи» становится решающим на граничном входе или при другом порядке действий?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу