трудно. Вопрос профанский, мне для себя убедиться, что я ничего не упустил.
Вот у меня есть базовый класс,
TBaseObject = class(TObject)
Есть от него наследники,
TObjectOne = class(TBaseObject)
procedure DoSomethingOne
end
TObjectTwo = class(TBaseObject)
procedure DoSomethingTwo
end
есть словарь объявленный базовым классом
TMyDict = TObjectDictionary<Integer, TBaseObject>
и у словаря свойство, читающее из него по ключу
property MyObject[I: Integer]: TBaseObject // геттер: Self.GetValue(I, Result)
Так вот. В словарь я складываю экземпляры и TObjectOne и TObjectTwo, а когда читаю из него свойством - то, если мне нужны свойства или методы конкретного типа - приходится каждый раз по месту приводить:
TObjectOne(dict.MyObject[I]).DoSomethingOne
Можно ли как-то объявить словарь или геттер, чтобы получать сразу нужный тип, и не приводить по месту?
TmyDict = class(TDictionary<Integer, TBaseObj>) public function GetConcreteTypeValue<Itm: TBaseObj>(Key: Integer): Itm; end; function TmyDict.GetConcreteTypeValue<Itm>(Key: Integer): Itm; var BaseItem: TBaseObj; begin BaseItem:=Items[Key]; if BaseItem is Itm then Result:=Itm(BaseItem) else Result:=nil; end; Вызов: myObjectOne:= myDict.GetConcreteTypeValue<TObjectOne> (ItemKey);
честно говоря вот никак не удается видеть в таком коде изящество. я имею в виду что решение норм, но оно никак не изящное, т.к. прямой кастинг по месту это вобщем-то вполне себе ООПшный костыль. ну а разве может костыль быть изящным?)
Обсуждают сегодня