Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.07.2015, 17:01   #1
var-alex
 
Регистрация: 27.07.2015
Сообщений: 3
По умолчанию XE2 шаблоны и хитрая задачка.

Задача простейшая. Делаю набор (хотя это громко сказано) классов для реализации задач на графах. Но в процессе реализации наткнулся на одну интересную штуку, которую так и не понял можно ли вообще сделать:

Получается так:
Код:
  TCustomTemlateGraph = class;
  TCustomTemplateNode = class;
  TCustomTemplateConnect = class;

  TCustomTemlateGraph = class

  end;

  TCustomTemplateNode = class

  end;

  TCustomTemplateConnect = class

  end;

  TTemplateConnect<O> = class(TCustomTemplateConnect)
  private
    fData:O;
  public
    property Data:O read fData write fData;
  end;

  TTemplateNode<O> = class(TCustomTemplateNode)
  private
    fData:O;
  public
    property Data:O read fData write fData;
  end;

  TTemplateGraph<N:TCustomTemplateNode; C:TCustomTemplateConnect> = class(TCustomTemlateGraph)
  public
    function NodeByData(<А вот тут то самое хитрое>):TCustomTemplateNode;
  end;
У класса графа, надо сделать метод, который будет искать нужный узел по связным данным, то есть тем, которые храняться в свойстве Data у узла. НО, тип данных свойства Data заранее не известен, в этом и весь смысл. Походу задача решения не имеет, и сделать такое не получится, но на всяких случай я решил проконсультироваться у сообщества.

p.s. да, понятно что собственно свойство Data можно внести у наследника и им пользоваться. Но вводится оно для более простой адаптации к существующему коду, да и подобные конструкции могут понадобиться в будущем, поэтому и интересуюсь.
var-alex вне форума Ответить с цитированием
Старый 27.07.2015, 20:44   #2
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию

Автор, прочитай эту тему, может что-то себе и прикрутишь в код
http://programmersforum.ru/showthread.php?t=280619
95% сбоев и ошибок приложений, находится в полу метрах от монитора
JUDAS вне форума Ответить с цитированием
Старый 28.07.2015, 09:05   #3
var-alex
 
Регистрация: 27.07.2015
Сообщений: 3
По умолчанию

Не, там совсем не то, что надо. Только жалко что та тема уже закрыта, я вроде как решение знаю, которое там подойдет автору. Почти они до него дошли, но не до конца.
var-alex вне форума Ответить с цитированием
Старый 28.07.2015, 11:58   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Только жалко что та тема уже закрыта, я вроде как решение знаю, которое там подойдет автору
могу открыть ту тему. Надо?
Serge_Bliznykov вне форума Ответить с цитированием
Старый 30.07.2015, 09:48   #5
var-alex
 
Регистрация: 27.07.2015
Сообщений: 3
По умолчанию

Автор забил, так что наверное смысла нету.
var-alex вне форума Ответить с цитированием
Старый 01.08.2015, 03:37   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Цитата:
Походу задача решения не имеет
для начала, задача не имеет четкого определения.

Цитата:
сделать такое не получится
еще бы понять, что же "такое" вам надо сделать )

Ну вот, например, этот код, даёт какие-то мысли?

Код:
type
  TNode = class
    Next: TNode;
  end;

  TGraph = class
    Root: TNode;
    function Add(N: TNode): TGraph;
  end;

  GNode<O> = class(TNode)
  public
    Data: O;
    constructor Create(value: O);
    function equal(value: O): boolean;
  end;

  GGraph<O; N: GNode<O>> = class(TGraph)
  public
    function NodeByData(value: O) : TNode;
  end;


{ TGraph }

function TGraph.Add(N: TNode): TGraph;
begin
  // TODO: add node to graph
  exit(self);
end;

{ GNode<O> }

constructor GNode<O>.Create(value: O);
begin
  inherited Create();

  Data := value;
end;

function GNode<O>.equal(value: O): boolean;
begin
  //  result := (Data = value); -- TODO
end;


{ TGraph<O, N> }

function GGraph<O, N>.NodeByData(value: O): TNode;
var
  node: TNode;
begin
  node := Root;
  while (node <> nil) do
  begin
    {B-}
    if ((node is N) and (node as N).equal(value)) then
      exit(node);

    node := node.Next;  // OK, it's not a tree here, but who said linked list could not be a tree some day
  end;
end;

var
  g: GGraph<Integer, GNode<Integer>>;
  n: TNode;
begin
  g := GGraph<Integer, GNode<Integer>>.Create();
  g.add(GNode<String>.Create('Hi')).add(GNode<Byte>.Create(123)).add(GNode<Boolean>.Create(True));

  n := g.NodeByData(123);
  if (n <> nil) then
    writeln('it works!');
end.
зы. пробовал в XE7, че там будет с этим кодом в XE2, неведомо.
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."

Последний раз редактировалось veniside; 01.08.2015 в 03:55. Причина: refactoring ;)
veniside вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хитрая задачка dmalsh Общие вопросы C/C++ 7 14.05.2015 20:58
Шаблоны в программировании VS Шаблоны в реальной жизни Alar Свободное общение 11 05.11.2014 10:24
Embarcadero Delphi XE2 Partner DVD (Зборник компонентов для XE2) volod3000 Софт 2 01.11.2011 02:26
Хитрая задача old slon Помощь студентам 4 13.05.2009 23:49