Hello all, I have a question about the usage of circular references in types. In a project I am working on, I am running into several situations where this type of design appears to be the best issue. For example, let's say I have this (this is a massive simplification but illustrates my point):
abstract TermStructure type Bond rate::Float64 ts::TermStructure mat_date::Date end function Bond(rate::Float64, mat_date::Date) ts = NullTermStructure() return Bond(rate, ts, mat_date) end type NullTermStructure <: TermStructure end type PiecewiseYieldCurve <: TermStructure settlement::Date bonds::Vector{Bond} end function PiecewiseYieldCurve(settlement::Date, sched::Schedule, rate:: Float64) bonds = Vector{Bond}(length(sched)) for (i, d) in enumerate(sched) new_bond = Bond(rate, d) bonds[i] = new_bond end pyc = PiecewiseYieldCurve(settlement, bonds) for b in bonds b.ts = pyc end return pyc end Firstly, I guess, is this the best implementation? There are situations where I need the bonds of the PiecewiseYieldCurve to be aware of the TermStructure to which they are connected. Secondly, do I take a performance hit from this? The PiecewiseYieldCurve instance will have parts of it updated as I run some of my pricer methods (not shown). Thanks! Chris