Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/14: Рейтинг темы: голосов - 14, средняя оценка - 4.93
Эксперт функциональных языков программированияЭксперт по математике/физике
4300 / 2091 / 431
Регистрация: 19.07.2009
Сообщений: 3,162
Записей в блоге: 24
1

Метаклассы

23.08.2010, 21:10. Показов 2845. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите, пожалуйста, сконструировать одну функцию.
Delphi
1
2
3
4
5
6
type
  O = class(TObject) end;
  C = class of O;
  I = class(O) 
  public class function Valid(AType: C): Boolean;
  end;
нужно написать функцию Valid(AType) так, что она возвращает true тогда и только тогда, когда AType есть наследник I.
Есть вариант:
Delphi
1
2
3
4
5
6
7
class function I.Valid(AType: C): Boolean;
var Tmp: O;
begin
  Tmp:=AType.Create;
  Valid:=Tmp is I;
  Tmp.Destroy;
end;
Но как-то нехорошо создавать временную переменную, ведь, во-первых, результат только от аргумента зависит и интуиция намекает, что можно и проще, и во-вторых, мало ли как может конструктор быть описан, я боюсь просто так писать AType.Create(...), может, какие побочные эффекты будут...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.08.2010, 21:10
Ответы с готовыми решениями:

Метаклассы
Помогите с решением теста Для чего нужны метаклассы: 1. для создания метаобъектов 2. для...

Являются ли метаклассы объектами?
Являются ли в лиспе метаклассы объектами, или это просто функции, которые вызываются перед...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
{c0Der}
138 / 123 / 18
Регистрация: 20.02.2009
Сообщений: 434
Записей в блоге: 4
23.08.2010, 23:53 2
изящного решения не знаю, но могу предложить попытку вызова какого либо метода, что-то вроде:
Delphi
1
2
3
4
5
6
7
8
9
10
class function tBla.Valid(AType: C): Boolean;
var Tmp: O;
begin
 try
  tBla(AType).Blablabla;
  result:=true;
 except
  result:=false;
 end;
end;
З.Ы. хотя вообще не вижу смысла в подобном, у тебя что динамически классы создаются?))
0
Эксперт функциональных языков программированияЭксперт по математике/физике
4300 / 2091 / 431
Регистрация: 19.07.2009
Сообщений: 3,162
Записей в блоге: 24
24.08.2010, 00:51  [ТС] 3
У меня компонент создается на основе типа "подданных" элементов (то есть одним из аргументов конструктора есть переменная типа метакласса). От него происходит другой тип-наследник, где есть некие ограничения на этот тип, поэтому необходимо делать проверку, является ли заявленный тип-аргумент наследником некоторого конкретного типа. Или в более простой форме я вопрос изложил выше, полагая, что этот критерий можно "засунуть" в классовую функцию. Но это как бы не важно.
0
233 / 95 / 15
Регистрация: 31.12.2009
Сообщений: 224
24.08.2010, 10:58 4
Delphi
1
2
3
4
5
6
7
[quote=Mysterious Light;921587]class function I.Valid(AType: C): Boolean;
var Tmp: O;
begin
 Tmp:=AType.Create;
 Valid:=Tmp is I;
 Tmp.Destroy;
end;[/quote]
в общем то само решение не так уж и плохо, но я бы подправил

Delphi
1
2
3
4
5
6
7
8
9
10
var
  Tmp: O;
begin
  try
    Tmp := AType.Create;
    Valid := Tmp is I;    
  finally
    Tmp.Free;
  end;
end;
Можно ещё посмотреть в сторону RTL
0
24.08.2010, 10:58
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru