У меня есть базовый класс прототип:Как отбрасывать динамический тип при общей функции?
class CItemProto {
public var id:Int;
public var count:Int;
...
}
и некоторые расширения различного рода:
class CItemThing extends CItemProto { ... }
class CItemResource extends CItemProto { ... }
class CItemRecipe extends CItemProto { ... }
... и так далее. Каждый экземпляр элемента имеет уникальный идентификатор, так что я могу хранить все свои вещи в одном классе инвентаризации с простым доступом IntMap:
class CInventory {
var mMap:IntMap<CItemProto>;
public function new() {
mMap = new IntMap();
}
public inline function set(item:CItemProto) { mMap.set(item.id, item); }
public function get<T:CItemProto>(id:Int):T {
var item = mMap.get(aId);
if (Std.is(item, Class<T>)) // it doesn't work saying Unexpected)
return cast item;
return null;
}
}
Моя точка зрения заключается в использовании Get() аксессор с некоторым определенного товара, и этот тип элемента и если я ошибаюсь в выборе типа, метод должен вернуть null значение. Например:
// should return instance of CItemThing if it exists or null in the other way
var thing:CItemThing = inventory.get(123);
Но это не работает. Простой небезопасный литье терпит неудачу, если я запрашиваю неправильный тип, безопасные литые запросы Динамический тип вместо общего T замена. Что делать, чтобы фильтровать запрошенные объекты по их типу? Я могу передать тип как второй аргумент, но он выглядит громоздким и чрезмерным.
ОБНОВЛЕНИЕ Я нашел тему How to look for a class type in an array using generics, поэтому мой вопрос не имеет смысла. Я передам желаемый тип в качестве второго аргумента.
Спасибо, я сделал то же самое решение. Теперь я вижу, что это не недостаток, чтобы передать класс как тип ожидаемых данных. – meps
Вы можете использовать 'return Std.instance (v, c)' для замены 'if..return cast ... return null' – KevinResoL