Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Зачем ссылка и объект разных типов?


Автор: Rohoss 22.2.2009, 10:41
Это из модуля Classes

Какой смысл ссылку делать типа TStream, а объект типа TFileStream?
Код

procedure TCustomMemoryStream.SaveToFile(const FileName: string);
var
  Stream: TStream;
begin
  Stream := TFileStream.Create(FileName, fmCreate);
  try
    SaveToStream(Stream);
  finally
    Stream.Free;
  end;
end;


Автор: THandle 22.2.2009, 10:56
В начале статьи про такое есть:
http://forum.vingrad.ru/articles/topic-211911.html

В данном случае, ИМХО, все равно как объявить.

Автор: Rohoss 22.2.2009, 11:14
Цитата(THandle @  22.2.2009,  10:56 Найти цитируемый пост)
В начале статьи про такое есть:http://forum.vingrad.ru/articles/topic-211911.html


THandle, там статья о файловых потоках, а я спрашивал о смысле использовать ссылку другого типа. Мы так же можем создать и TStringList
Код

procedure TForm1.FormCreate(Sender: TObject);
var
  List: TStrings;
begin
  List := TStringList.Create;
  List.Add('Text');
  ShowMessage(List.Text);
end;

С точки зрения работы кода я тоже думаю будет одинаково (не считая, что некоторые атрибуты класса, которые есть в TStringList и нет в TStrings будут не доступны). Ну наверное есть ещё какая-то причина, по которой так поступают…

Автор: Christoph 22.2.2009, 13:38
Если переменная Stream описана как ссылка на экземмпляр на экземпляр класса TStream, то и эта же переменная может указывать на класс TFileStream, TMemoryStream....и всего то
Ну например
Код

procedure TForm1.Button1Click(Sender: TObject);

Тут сендер может быть Button, edit,label...не знаешь что может лежать в Sender,потому и написали Sender:TObject, так как он может указывать на классы стоящие по иерархии ниже


Цитата(Rohoss @  22.2.2009,  11:14 Найти цитируемый пост)
С точки зрения работы кода я тоже думаю будет одинаково (не считая, что некоторые атрибуты класса, которые есть в TStringList и нет в TStrings будут не доступны). Ну наверное есть ещё какая-то причина, по которой так поступают…

В твоем примере создается Экземпляр класса TStringList и заносится ссылка на него в переменную класса TString, затем ты вызываешь метод из переменной TString.Add , а реально вызываемый описан в TStringList.Add . Это помоему называется полиморфизм  smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)