суббота, 5 апреля 2014 г.

Коротко. Как повод "для размышления". Интерфейсы vs. объекты

Опять ничего анализировать или "разжёвывать" не буду.

Просто приведу код:

type
 ISomeInterface = interface
  procedure SomeMethod;
 end;//ISomeInterface

 TSomeClass = class(TInterfacedObject, ISomeInterface)
  public
   procedure SomeMethod;
 end;//TSomeClass

...

procedure TSomeClass.SomeMethod;
begin
 if (Self = nil) then
  Write('nil')
 else
  Write(ClassName);
end;

...

var
 l_Nil : TSomeClass;
 l_NotNil : TSomeClass;
begin
 l_Nil := nil;
 l_Nil.SomeMethod; // - в выводе - nil
 ISomeInterface(l_Nil).SomeMethod; // AV

 l_NotNil := TSomeClass.Create;
 l_NotNil.SomeMethod; // - в выводе - TSomeClass
 ISomeInterface(l_NotNil).SomeMethod; // - в выводе - TSomeClass
end;

Ни на что "не претендую"...

Просто "заметки на полях"...

Просто тут есть момент "задуматься" - когда использовать интерфейсы, а когда - нет.

"Примерно" то же относится и к виртуальным методам.

Ну и ещё.. Не надо забывать про паттерн null-object - http://ru.wikipedia.org/wiki/Null_object_(%D0%A8%D0%B0%D0%B1%D0%BB%D0%BE%D0%BD_%D0%BF%D1%80%D0%BE%D0%B5%D0%BA%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F)

Комментариев нет:

Отправить комментарий