Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как изменить тип создоваемого объекта в методе предка. [D7, Win95/98, WinXP]


Страницы:   1 2

Kolan ©   (2005-09-26 16:02:00) 

Здравствуйте,
 Есть у меня стек:
TStack = class(TCustomList)
 private
 protected
 public
   function GetListAsString: string; override;
   function GetListAsStrings: TStrings; override;
   function Add(Data: TNodeData): Boolean; override;
   function Extract: TNodeData; override;
   constructor Create(FormHandle: THandle); override;
   destructor Destroy; override;
 end;

Вот его метод Add

function TStack.Add(Data: TNodeData): Boolean;
var
 Node: TCustomNode;
begin
 inherited Add(Data);
 Node := TCustomNode.Create;
 try
   Node.Data := Data;
   if Head <> nil then
     Node.FNext := Head;
   Head := Node;
   Result := True;
 except
   Result := False;
 end;    
end;


Теперь я хочу сделать такойже стек но элементы которого будут иметь две ссылки:

TDoubleTreeNode = class(TCustomNode)
 private
   FParent: TDoubleTreeNode;
 protected
 public
   constructor Create; override;
   destructor Destroy; override;
 end;


Как написать наследника от стека, поддерживающего элементы типа TDoubleTreeNode

Неужели для того, чтобы изменить
Node := TCustomNode.Create;
на
Node := TDoubleTreeNode.Create;
Придётся переписать весь код метода Add. (Переписать я его смогу ессесно, интересно узнать как правильно спроектировать классы.)


Kolan   (2005-09-26 20:44:00) [21]

jack128 ©   (26.09.05 17:34) [3]
Понял, большой Сенкс :)

umbra ©   (26.09.05 19:16) [4]
OK, но воспользуюсь [2]


umbra   (2005-09-26 19:16:00) [22]

Можно


TCustomListNode = class of TCustomNode;

TStack = class(TCustomList)
private
protected
function CreateNode: TCustomNode; virtual;
public
 function GetListAsString: string; override;
 function GetListAsStrings: TStrings; override;
 function Add(Node: TCustomNodeClass; Data: TNodeData): Boolean; override;
 function Extract: TNodeData; override;
 constructor Create(FormHandle: THandle); override;
 destructor Destroy; override;
end;

function TStack.Add(ANode: TCustomNodeClass; Data: TNodeData): Boolean;
var
Node: TCustomNode;
begin
inherited Add(Data);
Node := ANode.Create;
try
 Node.Data := Data;
 if Head <> nil then
   Node.FNext := Head;
 Head := Node;
 Result := True;
except
 Result := False;
end;    
end;


jack128   (2005-09-26 17:34:00) [23]

Или можно сделать событие OnCreateNode в котором создовать нужный узел. Тогда не придется для каждого наследника TCustomNode создовать наследника TStack. Либо, если TCustomNode имеет виртуальный конструктор, то можно создать свойство NodeClass: TCustomNodeClass; тогда даже обработчик события не нужно будет писать.  Но при прочих равных, я предпочитаю вариант из поста [2]


jack128   (2005-09-26 17:30:00) [24]

TStack = class(TCustomList)
private
protected
 function CreateNode: TCustomNode; virtual;
public
  function GetListAsString: string; override;
  function GetListAsStrings: TStrings; override;
  function Add(Data: TNodeData): Boolean; override;
  function Extract: TNodeData; override;
  constructor Create(FormHandle: THandle); override;
  destructor Destroy; override;
end;

TStack2 = class(TStack)
protected
 function CreateNode: TCustomNode; override;
end;

function TStack.CreateNode: TCustomNode;
begin
 Result := TCustomNode.Create;
end;

function TStack.Add(Data: TNodeData): Boolean;
var
Node: TCustomNode;
begin
inherited Add(Data);
Node := CreateNode;
try
 Node.Data := Data;
 if Head <> nil then
   Node.FNext := Head;
 Head := Node;
 Result := True;
except
 Result := False;
end;    
end;

function TStack2.CreateNode: TCustomNode;
begin
 Result := TDoubleTreeNode.Create;
end;


Kolan   (2005-09-26 17:18:00) [25]

Блин опять похоже никто не понял ничего
Я имею в виду что в предке будет

function TStack.Add(Data: TNodeData): Boolean;
var
Node: TCustomNode;
begin
inherited Add(Data);
Node := TCustomNode .Create;
try
  Node.Data := Data;
  if Head <> nil then
    Node.FNext := Head;
  Head := Node;
  Result := True;
except
  Result := False;
end;    
end;


А в потомке

function TStack.Add(Data: TNodeData): Boolean;
var
Node: TCustomNode;
begin
inherited Add(Data);
Node := TDoubleTreeNode .Create;
try
  Node.Data := Data;
  if Head <> nil then
    Node.FNext := Head;
  Head := Node;
  Result := True;
except
  Result := False;
end;    
end;

Это если переписать. Я вно я гдето ошибся. Как сделать так чтобы можно было
в качестве эл списка создавать  любого потомка TCustomNode

Может
inherited Add
а потом
преобразовать node из TCustomNodeв TDoubleTreeNode
Только как???


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо