E sad, posto ima gomila nepoznanica, a aplikacija se razvija paralelno sa samim sistemom koji nadzire, dosao sam na ideju da koristim arhitekuru baziranu na grafovima. Dakle imam baznu klasu Node (cvorovi grafa), te klase EventSource i DataSource koje definisu ivice grafa. Sam graf definisem u XML fajlu i python scriptom generisem C++ koji kreira cvorove i uspostavlja veze izmedju njih. Na ovaj nacin, vecinu logike guram u samu definiciju grafa (XML fajl), a ja vec mogu da implementiram gomilu nodova koje znam da ce mi trebati. Moze se cak reci da je XML fajl neka vrsta DSL-a (Domain Specific Language).
Konacno - pitanje: Node klasa je baza za EventSource i DataSource. Trebaju mi obe stvari (jedno radi pull, jedno push, ne mogu da ih objedinim). Obe klase moraju da znaju za Node (jer moraju da se identifikuju prema drugim cvorovima). Neki nodovi ce biti i EventSource i DataSource, sto dovodi do dijamanta (diamond problem). Turio sam da EventSource i DataSource virtuelno nasledjuju bazu Node i to je ok, e sad problem je sto Node klasa nema defaultni konstruktor, vec samo explicit konstruktor koji uzima parametar (nodeid). Medjutim ovo znaci da svaka klasa koja nasledjuje EventSource ili DataSource mora eksplicitno da zove Node(nodeid) konstruktor. Ovo je stvar virtuelnog nasledjivanja, gdje "most derived" klasa uvijek prvo zove virtuelne baze. Ovaj pristup mi se ne svidja jer su sve child klase "zaprljane" detaljima bazne klase - prvo moraju da i one uzimaju NodeId parametar, zatim moraju da ga proslijede Node konstruktoru. I tako za svaku child klasu. Gadno.
Alternativa je da Node klasi dam default konstruktor i dodatnu metodu setNodeId(NodeId). Ovo znaci da vise ne moram da se bakcem oko pozivanja baznog konstruktora u child klasama (poziva se implicitno). Mana je sto mi to malo smrdi, jer je uloga konstruktora da ustanovi invarijantu. Nemam problem sa tim da cu zaboraviti da setujem NodeId, jer kao sto rekoh, to ce sve da izgenerise python skripta svakako, ali opet..
Cini mi se da imam sukob izmedju rjesenja za koje mislim da je ispravno (prva opcija) i onog koje mi djeluje elegantno (druga opcija).
Pitanje je, postoji li neka treca i bolja opcija? Samo nemojte reci da je multiple inheritance zlo, zato sto u ovom slucaju bas fino odgovara problemu, kompozicija mi ne odgovara.