Вообще, методы, объявленные в коде как constructor и destructor, таковыми на самом деле не являются. Правдя тут надо отметить, что доступа к реальным конструктору и деструктору в Дельфи просто нет (не считаем различные хаки). Поэтому данные методы и используются для реализации выделения памяти под атрибуты классов (имеется в виду сложные атрибуты, являющиеся так же объектами классов, память под простые типы выделяется именно реальным конструктором, но вызов его скрыт от программиста). Т.е. по сути constructor и destructor являются инициализатором и деинициализатором по своей сути. Это для начала.
Теперь по повду "излишней функциональности". Во первых, ее всегда можно скрыть:
Код:
type
TMyObjectWithItems = class
private
FItems : TObjectList;
function GetItem(Index : Integer) : TAnotherObject;
function GetCount : Integer;
...
public
property Items[Index : Integer] : TAnotherObject read GetItem;
property Count : Integer read GetCount;
end;
...
function TMyObjectWithItems.GetItem(Index : Integer) : TAnotherObject;
begin
Result := FItems[Index] As TAnotherObject;
end;
function TMyObjectWithItems.GetCount : Integer;
begin
Result := FItems.Count;
end;
Таким образом ты прячешь "излишнюю функциональность", но можешь ею пользоваться, если надо.
Теперь ответы на последние 2 вопроса.
1. Да, надо. Для проверки, если используешь одну из последних версий Дельфи, можешь включить отчет об утечках памяти. При закрытии приложения тебе менеджер памяти скажет, если есть утечки.
2. Да, их тоже надо удалять в деструкторе. В принципе, при правльном дизайне, это по одной строчке в конструкторе и деструкторе (создать и, соответсвенно, удалить).