guarda Moreno è un po difficile da spiegare ma alla fine una risoluzione dalle mappe dei ref/id quando serve nel visitor puo andare bene secondo me, io uso un visitor per ogni elemento architettonico che voglio usare , ti posto l'esempio.
questo è il visitor specifico che eredita da Visitor:
class ColumnsVisitor : Visitor
{
public override bool visitIfcColumn(IfcColumn value)
{
value.Representation.Item.acceptVisitor(this);
return true;
}
public override bool visitIfcProductDefinitionShape(IfcProductDefinitionShape value)
{
if (value.@ref != null)
value = (IfcProductDefinitionShape)Singleton.Instance.Resolve(value);
string str = value.Representations.IfcRepresentation[0].@ref;
return true;
}
public override bool visitIfcProductRepresentation(IfcProductRepresentation value)
{
if (value.@ref != null)
{
IfcProductDefinitionShape value1 = (IfcProductDefinitionShape)Singleton.Instance.Resolve(value);
value1.acceptVisitor(this);
}
return true;
}
}
Visitor un pezzo
public class Visitor
{
//public virtual bool visitEntity(Entity value)
//{
// return false;
//}
public virtual bool visitIfcStructuralConnectionCondition(IfcStructuralConnectionCondition value)
{
return false;
}
public virtual bool visitIfcStructuralLoad(IfcStructuralLoad value)
{
return false;
}
public virtual bool visitIfcStructuralLoadStatic(IfcStructuralLoadStatic value)
{
return false;
}
public virtual bool visitIfcRoot(IfcRoot value)
{
return false;
}
public virtual bool visitIfcOwnerHistory(IfcOwnerHistory value)
{
return false;
}
in pratica nel visitor specifico faccio l'override delle funzioni con i tipi che mi interessano e per risolvere un tipo faccio oggettotipo.acceptchanges(this) dove this è questo visitor quindi se uso un override gestito bene col double dispatch mi risolve il tipo, puo essere giusto?
il problema è che il resolve deve essere una funzione del genere:
public Entity Resolve(Entity ent)
{
if(ent.@ref != "")
return lid[ent.@ref];//lid è la mappa chiave(ref) valore(entity di quell id)
return ent;
}
mi torna un oggetto di classe entity e il double dispatch non funziona piu e non so come fare.non vorrei fare casting perchè non so che tipo di oggetto avro runtime quello sara risolto dal visitor e processato nella funzione di cui faccio l'override in modo diverso a seconda del tipo.
creo cioè dei comportamenti di parsing diversificati all interno della funzione del tipo risolto ad doc.
Se uso la funzione resolve posso anche creare l'accept visitor nell' oggetto entity ma mi da stack overflow perchè tutti i tipi derivano da entity quindi non risolvo piu il tipo.
grazie.
ciao.
scusa se non capisci ancora qualora lascierò perdere ciao e scusa.
grazie.
Modificato da giuseppe500 il 01 dicembre 2016 18.17 - scusami ho capito l'errore, le funzioni nel visitor si devono chiamare tutte visit(con il value diverso)
scusa.