Привет у меня есть один вопрос, касающийся некоторых подходов приведения типов. Я перевожу некоторые файлы Delphi на C ++. У меня есть объявление класса delphi, которое является производным от TList, и это базовый класс для других производных классов.
type TBaseItem = class (TObject)
public
procedure SomeProcedure; virtual; abstract;
end;
Type TBaseClass = class(TList)
private
function GetItem(Index: Integer): TBaseItem;
procedure SetItem(Value: TBaseItem; Index: Integer);
public
property Items[Index: Integer]: TBaseItem read GetItem write SetItem;
end;function TBaseClass.GetItem(Index: Integer): TBaseItem;
begin
Result := TBaseItem(inherited Items[Index]);
end;
procedure TBaseClass.SetItem(Value: TBaseItem; Index: Integer);
begin
inherited Items[Index] := Value;
end;
Это два базовых класса TBaseItem и TBaseClass. Итак, здесь объявлены новые классы TchildItem, производные от TBaseItem и TChildClass, производные от TBaseClass. TChildItem переопределяет метод SomeMethod, и, что более важно, TChildtClass переопределяет свойство Items таким образом, что теперь мы возвращаем элементы TParentItem, созданные из TBaseItem.
type TChildItem = class (TBaseItem)
public
procedure SomeProcedure; override;
end;
type TChildClass = class(TBaseClass)
private
function GetItem(Index: Integer): TChildItem;
procedure SetItem(Value: TChildItem; Index: Integer);
public
property Items[Index: Integer]: TChildItemread GetItem write SetItem;
end;
function TChildClass .GetItem(Index: Integer): TChildItem;
begin
Result := TChildItem(inherited Items[Index]);
end;
procedure TChildClass.SetItem(Value: TChildItem; Index: Integer);
begin
inherited Items[Index] := Value;
end;
В этом примере я хотел показать, как легко можно получить классы и переопределить свойства. Чтобы получить правильный тип элемента из списка, достаточно вызвать родительское (базовое) свойство Item и привести его к нужному типу. Это Delphi Apporach.
Интересно, как я могу перевести эту часть кода на C ++. В настоящее время я объявил новый базовый класс, который не является производным от какого-либо класса и имеет открытую переменную Var Items, которая
class TBaseItem{
virtual void SomeMethod();
}
class TBaseClass {
public:
vector<TBaseItem> Items;
};class TChildItem : public TBaseItem{
}
class TChildClass : public TBaseClass {
};
а затем использовать
return (TChildItem) Items[Idx]
Это означает, что я хотел бы получить доступ к общедоступным переменным родителя (TBaseClass), таким как этот Vector Items, и привести их к нужному типу … Мое первое впечатление, что я мог бы пойти в неправильном направлении с этим подходом Delphi.
Что ты предлагаешь? Как я должен идти с этим?
БОЛЬШОЕ СПАСИБО!
Delphi-код — старый и предшествующий дженерикам, аналог Delphi для шаблонов C ++. В современном Delphi-коде эти классы списков просто не существуют. Вместо этого можно было бы использовать TList<TBaseItem>
а также TList<TChildItem>
,
В коде C ++ вы просто используете vector<TBaseItem*>
а также vector<TChildItem*>
, В вашем переводе на C ++ просто нет смысла реализовывать TBaseClass
а также TChildClass
,
Я также исправил бы вашу терминологию. Свойства Delphi не могут быть переопределены. Новая недвижимость в TChildClass
это просто новая собственность.
Других решений пока нет …