Thanks! I'm having a bit of trouble with that setup when the type is
parameterized, as below:
*abstract AbstractAtype A <: AbstractA endtype B{T <: AbstractA} a::T B()
= new()end*
I am getting this error:
*ERROR: MethodError: `convert` has no method matching
convert(::Type{B{T<:AbstractA}})*
*This may have arisen from a call to the constructor B{T<:AbstractA}(...),*
*since type constructors fall back to convert methods.*
Closest candidates are:
convert{T}(::Type{T}, *::T*)
call{T}(::Type{T}, *::Any*)
in call at essentials.jl:57
Is that the proper way to set that up?
Thanks!!
Chris
On Friday, January 1, 2016 at 4:45:12 PM UTC-5, Tim Holy wrote:
>
> If you make `ts` the last parameter, using an inner constructor you can
> leave
> that field undefined when you initially create the object, then fill it in
> later.
> You may need to sprinkle some `isdefined(b, :ts)` in various places in
> your
> code.
>
> Happy New Year!
> --Tim
>
> On Friday, January 01, 2016 11:01:02 AM Christopher Alexander wrote:
> > 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
> PiecewiseYieldCurve,
> > 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-ambigu
> > >> ous-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
>
>