I'm actually having a slight problem with this implementation. Basically, in using the parametric approach above, when I initially create an instance of the Bond type with the NullTermStructure and then set its term structure with the new TermStructure instance that I create (creating the circular reference), I get a convert error. I'm assuming this is because the initial instantiation of the Bond wants a TermStructure of type NullTermStructure, so then when I try to re-set it with TermStructure, it complains. Is there any way to avoid setting it with the NullTermStructure in the first place?
Thanks! Chris On Friday, January 1, 2016 at 1:24:21 PM UTC-5, Christopher Alexander wrote: > > Thanks Tim, this is very helpful! Happy New Year! > > - Chris > > On Thursday, December 31, 2015 at 6:33:29 PM UTC-5, Tim Holy wrote: >> >> See >> http://docs.julialang.org/en/stable/manual/faq/#how-do-abstract-or-ambiguous-fields-in-types-interact-with-the-compiler >> >> and the section >> afterwards. You'd be better off with >> >> type Bond{T<:TermStructure} >> rate::Float64 >> ts::T >> mat_dat::Date >> end >> >> --Tim >> >> On Thursday, December 31, 2015 02:42:11 PM Christopher Alexander wrote: >> > 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 >> >>