Форум: "Основная";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
ВнизВопрос оперторов... Найти похожие ветки
← →
Tihas (2003-02-26 23:45) [0]Долгое время я знал, что Object Pascal не поддерживает перегрузку операций, но вдруг я замечаю у класс
TList вот такое вырожение.
property Items[Index: Integer]: Pointer read Get write Put; default;
Таким оброзом, а они смогли "подцепить" операцию [].
Так вопрос существуют ли ещё в Delphi, такого же типа
конструкции, но с другими операциями? А если нет, то зачем надо было вводить эту возможность(сильного удобства не прибавило)?
Заранее спасибо.
← →
Романов Р.В. (2003-02-26 23:59) [1]F1 - Array properties
← →
Palladin (2003-02-27 00:38) [2]ничего себе не прибавило...
такая конструкция существует давным давно... еще с ранних версий Delphi
позволяет очень удобно обращатся к однородным TList
например есть у тебя
PRecord=^TRecord;
TRecord=record
field1:string;
field2:integer;
end;
у себя в классе делаешь объявление
type
TMyClass=class
private
m_lItems:TList;
function GetItem(idx:integer):TRecord;
public
property Items[Indxe: integer]: TRecord read GetItem; default;
end;
function TMyClass.GetItem;
begin
result:=PMyRecord(m_lItems[idx])^;
end;
и тогда обращение к списку сводится лишь к такому
var
MyObject:TMyClass;
...
MyObject[1]
или
MyObject[i];
еще круче когда в параметре индексированого свойства указывается не индекс а скажем какое нибудь другое поле... например...
PRecord=^TRecord;
TRecord=record
field1:string;
field2:integer;
end;
type
TMyClass=class
private
m_lItems:TList;
function GetItemByField2(val:integer):PRecord;
public
property ItemsByField2[Val: integer]: PRecord read GetItemByField2; default;
end;
function TMyClass.GetItem;
var
i:integer;
begin
result:=nil;
for i:=0 to m_lItems.Count-1 do
if PRecord(m_lItems[i]).Field2=val then
begin
result:=m_lItems[i];
break;
end;
end;
и обращатся к любой записи по значению Field2 становится просто прелестно
MyObject[17]
это простые примеры удобства данной конструкции...
← →
Palladin (2003-02-27 00:46) [3]если ты не заметил то TStringList.Values реализован именно таким способом...
← →
Anatoly Podgoretsky (2003-02-27 10:29) [4]Только здесь перегрузкой операторов и не пахнет, это свойство а не оператор и это было изначально для свойств.
Да и [] это тоже не оператор, а инднексные скобки.
← →
Tihas (2003-02-28 23:54) [5]Спасибо за комментарии.
← →
Strumpf (2003-03-03 14:49) [6]Вроде где-то читал, что перегрузку операторов все-же ввели в Delphi 7. Это правда?
← →
calm (2003-03-03 15:03) [7]Да она была как минимум в D6, и если не ошибаюсь в D5.
Перегрузка операций осущствляется директивой overload;
← →
Polevi (2003-03-03 15:08) [8]операции это процедуры и ф-ии но никак не операторы
← →
Strumpf (2003-03-03 15:13) [9]calm © (03.03.03 15:03)
Что-то Вы не о том ...
← →
Strumpf (2003-03-03 15:15) [10]а может это я не о том. Имелось в виду операций, конечно ("+", "-" и т.д.).
← →
calm (2003-03-03 15:47) [11]
> Долгое время я знал, что Object Pascal не поддерживает перегрузку операций,
Думается мне, что я о том, что спрашивали...
А перегрузку оператором можно выполнить в D6.
Хотя, строго говоря, это не будет являться перегрузкой. Но имеется возможность определить действия +, - и т.д. для данных своего типа (TMyDataType). Это можно сделать, научив вариантные (variant) переменные воспринимать значения типа TMyDataType.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2003.03.13;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c