Предыдущий пост был тут - Об "опасностях" ARC и прочих "автоматов". Пока коротко
Разовьём тему.
Пусть у нас есть "аналог" IStorage:
-- И пусть спецификация работы с интерфейсом такова - если мы открыли "внутреннее хранилище", то мы не можем открыть его снова, если мы его не отпустили.
Приведу пример:
Как быть?
Тут варианта два. Оба они перечислены тут - Ответ на задачку №13
Так:
Или так:
Понимаю, что это всё - "повторение пройденного", но "повторение - мать учения".
Но это ещё не всё.
Продолжу в следующем посте.
Разовьём тему.
Пусть у нас есть "аналог" IStorage:
type ImyStorage = interface ... fuction Open(const aName: String): ImyStorage; ... end;//ImyStorage
-- И пусть спецификация работы с интерфейсом такова - если мы открыли "внутреннее хранилище", то мы не можем открыть его снова, если мы его не отпустили.
Приведу пример:
procedure ProcessStorage(const aRoot: ImyStorage);
var
l_A1 : ImyStorage;
l_A2 : ImyStorage;
begin
l_A1 := aRoot.Open('A').Open('1');
// - тут всё хорошо, тут всё открылось
...
l_A2 := aRoot.Open('A').Open('2');
// - тут всё плохо, тут НЕ ОТКРЫЛОСЬ
// ПОЧЕМУ?
...
// - а потому, что aRoot.Open('A') - доживает ДО СЮДА
// всё в соответствии со спецификацией - "если мы открыли "внутреннее хранилище",
// то мы не можем открыть его снова, если мы его не отпустили"
end;
Как быть?
Тут варианта два. Оба они перечислены тут - Ответ на задачку №13
procedure ProcessStorage(const aRoot: ImyStorage);
var
l_A : ImyStorage;
l_A1 : ImyStorage;
l_A2 : ImyStorage;
begin
l_A := aRoot.Open('A');
l_A1 := l_A.Open('1');
// - тут всё хорошо, тут всё открылось
l_A := nil;
...
l_A := aRoot.Open('A');
l_A2 := l_A.Open('2');
// - тут всё хорошо, тут всё открылось
l_A := nil;
...
end;
Или так:
procedure ProcessStorage(const aRoot: ImyStorage);
function OpenInner(const aName: String): ImyStorage;
begin//OpenInner
Result := aRoot.Open('A').Open(aName);
end;//OpenInner
var
l_A1 : ImyStorage;
l_A2 : ImyStorage;
begin
l_A1 := OpenInner('1');
// - тут всё хорошо, тут всё открылось
...
l_A2 := OpenInner('2');
// - тут всё хорошо, тут всё открылось
...
end;
Понимаю, что это всё - "повторение пройденного", но "повторение - мать учения".
Но это ещё не всё.
Продолжу в следующем посте.
Комментариев нет:
Отправить комментарий