Desidero utilizzare gli oggetti tratto in un Vec
. In C++ potrei creare una classe base Thing
da cui deriva Monster1
e Monster2
. Potrei quindi creare un std::vector<Thing*>
. Gli oggetti Thing
devono memorizzare alcuni dati, ad es. x : int, y : int
, ma le classi derivate devono aggiungere più dati.Come posso creare una collezione eterogenea di oggetti?
Attualmente ho qualcosa di simile
struct Level {
// some stuff here
pub things: Vec<Box<ThingTrait + 'static>>,
}
struct ThingRecord {
x: i32,
y: i32,
}
struct Monster1 {
thing_record: ThingRecord,
num_arrows: i32,
}
struct Monster2 {
thing_record: ThingRecord,
num_fireballs: i32,
}
definisco un ThingTrait
con i metodi per get_thing_record()
, attack()
, make_noise()
ecc e la loro attuazione per Monster1
e Monster2
.
se i tuoi mostri sono per lo più noti in anticipo (cioè il vostro non è la creazione di un motore di gioco che permette a tutti di creare un nuovo mostro) si potrebbe in alternativa lavorare con un enum –
Vedi anche [la discussione su reddit] (http://www.reddit.com/r/rust/comments/2sh28k/best_way_to_implement_heterogeneous_collection_of/). (A proposito, se si incrocia una domanda, è generalmente educato almeno il collegamento tra di loro in modo che, ad esempio, le persone interessate non perdano la discussione). – huon
Ok. Sono combattuto tra l'utilizzo di Tratti e un metodo che restituisce i dati condivisi ... o semplicemente usando un enum per tutto. Penso che il primo sia il minore di due mali. Se l'ereditarietà verrà aggiunta alla lingua, come sarà? A parte questo, non mi manca quasi nulla di C++. Una boccata d'aria fresca. – stevenkucera