![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как изменить тип создоваемого объекта в методе предка. [D7, Win95/98, WinXP]
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
Только как???