# Question about method dispatch with composite types

**URL:** <https://discourse.julialang.org/t/question-about-method-dispatch-with-composite-types/53680>\
**Category:** General Usage\
**Created:** [January 20, 2021, 5:26pm UTC](https://discourse.julialang.org/t/question-about-method-dispatch-with-composite-types/53680 "2021-01-20T17:26:46Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![askvorts](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/askvorts/32/7120_2.png) [@askvorts](https://discourse.julialang.org/u/askvorts)\
**Post date:** [January 20, 2021, 5:26pm UTC](https://discourse.julialang.org/t/question-about-method-dispatch-with-composite-types/53680/1 "2021-01-20T17:26:46Z")

</div>

In the bellow script, being `dc.x` and `dc.y` equal to `1` the default, how may I (if possible) create the following methods:

`divide(a,Clock())` and `divide(a,Pendulum())`

returning the same as `divide(a,CLock(1))`, `divide(a,Pendulum(1))`, respectively.

```julia
abstract type Wave end

struct Clock <: Wave
      x::Int
end

struct Pendulum <: Wave
    y::Int
end

function divide(a, dc::Clock)
    if dc.x == 1
        return a/2
    else
        return a/10
    end
end

function divide(a, dc::Pendulum)
    if dc.y == 1
        return a/20
    else
        return a/100
    end
end

```

---

<div class="post-metadata">

**Author:** ![JeffreySarnoff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/jeffreysarnoff/32/1980_2.png) [@JeffreySarnoff](https://discourse.julialang.org/u/JeffreySarnoff)\
**Post date:** [January 20, 2021, 6:03pm UTC](https://discourse.julialang.org/t/question-about-method-dispatch-with-composite-types/53680/2 "2021-01-20T18:03:06Z")

</div>

If I understand your question, you could add

```julia
Clock() = Clock(1)
Pendulum() = Pendulum(1)

```

then

```julia
a = 100
divide(a, Clock(1)) == divide(a, Clock()) == 50.0
divide(a, Pendulum(1)) == divide(a, Pendulum()) == 5.0

```

However, what you are after is likely available more elegantly too.  
Are you looking for something like this?

```julia
abstract type Wave end

struct Clock <: Wave
      slow::Bool
end

struct Pendulum <: Wave
    slow::Bool
end

function divide(a, wave::Clock)
    return wave.slow ? a/2 : a/10
end

function divide(a, wave::Pendulum)
    return wave.slow ? a/20 : a/100
end

const SlowClock = Clock(true)
const FastClock = Clock(false)
const SlowPendulum = Pendulum(true)
const FastPendulum = Pendulum(false)

```

then

```julia
julia> a = 100
100

julia> divide(a, SlowClock)
50.0

julia> divide(a, FastClock)
10.0

julia> divide(a, SlowPendulum)
5.0

julia> divide(a, FastPendulum)
1.0

```

---

<div class="post-metadata">

**Author:** ![askvorts](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/askvorts/32/7120_2.png) [@askvorts](https://discourse.julialang.org/u/askvorts)\
**Post date:** [January 20, 2021, 7:01pm UTC](https://discourse.julialang.org/t/question-about-method-dispatch-with-composite-types/53680/3 "2021-01-20T19:01:43Z")

</div>

Thank you very much. Your suggestion worked like a charm!
