<div dir="ltr">Erlang's behaviour is NOT an interface!<div>If you are looking for some analogy from other languages the closest one is abstract classes in C#.</div><div><br></div><div><br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">вт, 24 авг. 2021 г. в 01:00, Brett Hemes <<a href="mailto:brhemes@mmm.com">brhemes@mmm.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div lang="EN-US" style="overflow-wrap: break-word;">
<div class="gmail-m_3540961728461408524WordSection1">
<p class="MsoNormal">... should I?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I have some servers that carry around references to other (let’s call them child) servers.  Each of the referenced child servers are doing their own thing and are implemented as different modules but also share some common functions (albeit
 with different implementations).  At some point, I end up fetching a reference to a child server and want to make a call that is common to all of the child servers.  As of right now I do not know what specific type (module) the child server is, only that they
 ALL offer some subset of functionality.<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Assuming I am not approaching this entirely wrong (which could be the case) I have identified two leading options for my case:<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">1) use a behaviour (perhaps improperly) as a pure interface (i.e., with only callbacks and no "general" functionality).  For a child implemented in a `my_child_mod` module that implements behaviour `my_iface`, this could result in calls
 like `my_iface:a_common_fun(ChildServerRef)` after fetching the child server reference where I use the behaviour's module to access the child's functionality... OR<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">2) store the particular module of each child with the reference and use the stored module name at time of the call (and know/assume that all children have some shared functionality).  So using some tuple or similar `{my_child_mod, ChildServerRef}`
 (versus just the reference) could result in a call like `my_child_mod:a_common_fun(ChildServerRef)` after fetching the reference info (as a tuple).<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I, perhaps naively, gravitate towards #1 above for various reasons (compile-time checks, only having to carry around refs, my C++ background, etc.), but the internet (and ferd in particular here (<a href="https://stackoverflow.com/questions/4119477/implementing-interfaces-in-erlang/4119615#4119615)" target="_blank">https://stackoverflow.com/questions/4119477/implementing-interfaces-in-erlang/4119615#4119615)</a>)
 seems to imply that this is not the Erlang way (despite finding OTP cases like this:
<a href="https://github.com/erlang/otp/blob/master/lib/ssh/src/ssh_sftpd_file_api.erl" target="_blank">
https://github.com/erlang/otp/blob/master/lib/ssh/src/ssh_sftpd_file_api.erl</a>).   ... shame on me?<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">I am trying very hard to leave my C++ past behind and do things in the Erlang way, but need a little help in this particular case...<u></u><u></u></p>
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal">Thanks,<u></u><u></u></p>
<p class="MsoNormal">Brett<u></u><u></u></p>
</div>
</div>

</blockquote></div>