![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Переменная содержащая тип [D5, D7, Win2k, WinXP]
dust © (2005-12-29 12:11:00)Хочу передавать в конструктор тип.
Если точнее -
Result := typed(ptmp^); где typed - член класса
Существуют ли вообще в делфи переменные, которые могут хранить тип?
Может быть существует другой подход к этому вопросу?
evvcom (2005-12-30 10:42:00) [1]
> Вроде dust про объекты и говорит.
Да, вроде действительно. Тогда тип TObject и нефиг нам парить мозги.
tesseract (2005-12-30 10:05:00) [2]Надо заниматься полиморфизмом. Число возможных данных не может быть бесконечным.
Да и чем тебе Tlist/TObjectList не нравятся?
> Можно, если передан действительно объект, что совсем необязательно.
Вроде dust про объекты и говорит.
evvcom (2005-12-30 09:46:00) [3]
> Можно. Как и в процедуре, через ссылку.
Вообще-то фраза "функцию, которая будет возвращать" подразумевает под собой возврат значения именно как результат функции, т.е. как Result := Value;
Еще раз повторю, что даже в этом случае в переменной var untypedvar возвращается не тип, а значение неопределенного типа. Это разные понятия.
> Можно также выяснить класс объекта
Можно, если передан действительно объект, что совсем необязательно.
tesseract (2005-12-29 22:38:00) [4]
> а объявить функцию, которая будет возвращать неопределённый тип можно?
Можно. Как и в процедуре, через ссылку.
function returnsmth(var untypedvar):integer
Передача untypedvar идёт по ссылке, Используй его в качестве result.
Можно также выяснить класс объекта (спасибо RTTI)
if untypedvar is TmyClass then {}
Tesla (2005-12-29 16:31:00) [5]Что-то мне говорит о том, что автору поста нужен аналог С-шных шаблонов...
evvcom (2005-12-29 16:05:00) [6]
> которая будет возвращать неопределённый тип можно?
Нельзя. Функция не умеет возвращать типы вообще, она может возвращать только значения. Вот значение может быть неопределенного типа. Обычно в этом случае функция возвращает просто указатель на переменную неопределенного типа, т.е.
function MyFunction: Pointer;
Digitman (2005-12-29 12:54:00) [7]см. TObject.ClassType
Игорь Шевченко (2005-12-29 12:54:00) [8]
> а объявить функцию, которая будет возвращать неопределённый
> тип можно?
TObject - чем плохо
Rouse_ (2005-12-29 12:47:00) [9]
> а объявить функцию, которая будет возвращать неопределённый
> тип можно?
Нет, базовый класс должен быть обьявлен... Передавать можно производные от него.
dust (2005-12-29 12:45:00) [10]а объявить функцию, которая будет возвращать неопределённый тип можно?
dust (2005-12-29 12:44:00) [11]т.е. вы предлагаете, перед использованием контейнера задавать ему тип объектов - не годится, потому как один и тот же контейнер (класс контейнера) я собираюсь использвать для различных обектов в одном модуле
DesWind (2005-12-29 12:30:00) [12]
type
TTGSBookmarkItemClass = class of TGSBookmarkItem;
Digitman (2005-12-29 12:30:00) [13]ну а причем здесь "поле класса" ?
dust (2005-12-29 12:29:00) [14]Собственно я пишу контейнер, у которого есть методы GetCurrent(), procedure Append (const item); procedure AddFirst (const item);
так вот, я хочу, чтобы можно было написать:
Variable := Conteiner.GetCurrent();
но, существует одно "но " я не знаю как кого типа элементы будут в контейнере, а каждый раз приводить к AnyType не хочется
Variable := AnyType(Conteiner.GetCurrent());
Anatoly Podgoretsky (2005-12-29 12:21:00) [15]dust © (29.12.05 12:11)
Тоже самое, но по русски
Rouse_ (2005-12-29 12:19:00) [16]Ну к примеру вот так:
TGSBookmarkItem = class(TCollectionItem);
TGSBookmarkCollection = class(TOwnedCollection)
public
constructor Create(AOwner: TPersistent);
end;
TGSBookmarkList = class(TCustomControl)
private
FItems: TGSBookmarkCollection;
protected
function GetItemsClass: TCollectionItemClass; virtual;
end;
implementation
constructor TGSBookmarkCollection.Create(AOwner: TPersistent);
begin
inherited Create(AOwner, TGSBookmarkList(AOwner).GetItemsClass);
end;
function TGSBookmarkList.GetItemsClass: TCollectionItemClass;
begin
Result := TGSBookmarkItem;
end;
Игорь Шевченко (2005-12-29 12:15:00) [17]Переменные существуют, но непонятно, чего ты хочешь. Подробности давай.
Digitman (2005-12-29 12:15:00) [18]
> Result := typed(ptmp^); где typed - член класса
если typed - это действительно идентификатор некоего члена некоего класса, то такой код компилятор просто обязан отправить фтопку.
в противном случае typed у тебя есть идентификатор некоего типа, но никак не идентификатор члена класса.