<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Hello,<div class=""><br class=""></div><div class="">If you did it this way Tempfile would no longer have the same interface as File. The constructor signature has changed so I think you’d be violating the Liskov substitution principle. If Tempfile IS-A File then I should be able to use it in place of File in any code that uses File.</div><div class=""><br class=""></div><div class="">There’s quite a lot in the inheritance vs composition debate, and some of it is quite subtle - I don’t feel knowledgable enough to cover much of it. There’s a brief overview on Wikipedia to get started with: <a href="https://en.wikipedia.org/wiki/Composition_over_inheritance#Benefits" class="">https://en.wikipedia.org/wiki/Composition_over_inheritance#Benefits</a></div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Craig</div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 26 Jan 2016, at 12:39, Jonathon Horsman <<a href="mailto:jonathon@arctickiwi.com" class="">jonathon@arctickiwi.com</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div dir="ltr" class="">Makes sense, thanks.<div class=""><br class=""></div><div class="">So what's the advantage of this instead of directly subclassing File?</div><div class=""><br class=""></div><div class="">Using this example, couldn't you equally...</div><div class=""><br class=""></div><div class=""><div style="font-size:12.8px" class="">class Tempfile < File</div><div style="font-size:12.8px" class="">    def initialize basename, temp_dir = '/tmp'</div><div style="font-size:12.8px" class="">      file_name = [ basename, rand(1_000_000_000), Time.now.to_f ].join('-')</div><div style="font-size:12.8px" class="">      file_path = File.join temp_dir, file_name</div><div style="font-size:12.8px" class="">      <b class="">open file_path, ... # calls up to File</b></div><div style="font-size:12.8px" class="">    end</div></div><div style="font-size:12.8px" class=""><br class=""></div><div style="font-size:12.8px" class="">Thanks again</div></div><div class="gmail_extra"><br class=""><div class="gmail_quote">On 26 January 2016 at 12:32, Craig R Webster <span dir="ltr" class=""><<a href="mailto:craig@xeriom.net" target="_blank" class="">craig@xeriom.net</a>></span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word" class="">Hi Jonathon,<div class=""><br class=""></div><div class="">Looks like it’s Ruby all the way down:</div><div class=""><br class=""></div><div class="">  <a href="http://ruby-doc.org/stdlib-2.2.2/libdoc/delegate/rdoc/Object.html" target="_blank" class="">http://ruby-doc.org/stdlib-2.2.2/libdoc/delegate/rdoc/Object.html</a></div><div class=""><br class=""></div><div class="">The example is a little hard to read at a glance, but this is a method to allow composition instead of inheritance. One might rewrite the code something like this to make it more obvious what’s being attempted in this case (with apologies for quick hackiness and glossed-over subtleties):</div><div class=""><br class=""></div><div class="">  class Tempfile</div><div class="">    def initialize basename, temp_dir = '/tmp'</div><div class="">      file_name = [ basename, rand(1_000_000_000), Time.now.to_f ].join('-')</div><div class="">      file_path = File.join temp_dir, file_name</div><div class="">      @file = File.open file_path, ...</div><div class="">    end</div><div class=""><br class=""></div><div class="">    def method_missing name, *args</div><div class="">      @file.send name, *args</div><div class="">    end</div><div class=""><br class=""></div><div class="">    def respond_to? name</div><div class="">      @file.respond_to? name</div><div class="">    end</div><div class="">  end</div><div class=""><br class=""></div><div class="">The resulting class will support the same API and behaviour as the class delegated to, except where the behaviour is overwritten. </div><div class=""><br class=""></div><div class="">Cheers,</div><div class="">Craig</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><div class=""><blockquote type="cite" class=""><div class=""><div class="h5"><div class="">On 26 Jan 2016, at 12:05, Jonathon Horsman <<a href="mailto:jonathon@arctickiwi.com" target="_blank" class="">jonathon@arctickiwi.com</a>> wrote:</div><br class=""></div></div><div class=""><div class=""><div class="h5"><div dir="ltr" class="">Hi<div class=""><br class=""></div><div class="">Trying to understand Tempfile, so reading the docs:</div><div class=""><br class=""></div><div class=""><a href="http://docs.ruby-lang.org/en/2.2.0/Tempfile.html" target="_blank" class="">http://docs.ruby-lang.org/en/2.2.0/Tempfile.html</a><br class=""></div><div class=""><br class=""></div><div class="">I assume it's a subclass of IO, but I can't see any mention of this.</div><div class=""><br class=""></div><div class="">It does however say:</div><div class=""><b class=""><br class=""></b></div><div class=""><b class="">Parent:</b></div><b class="">DelegateClass(File)</b><div class=""><b class=""><br class=""></b></div><div class="">what does this mean?</div><div class=""><br class=""></div><div class="">Thanks in advance</div><div class=""><br class=""></div><div class="">Jonno</div></div></div></div><span class="">
_______________________________________________<br class="">Chat mailing list<br class=""><a href="mailto:Chat@lists.lrug.org" target="_blank" class="">Chat@lists.lrug.org</a><br class="">Archives: <a href="http://lists.lrug.org/pipermail/chat-lrug.org" target="_blank" class="">http://lists.lrug.org/pipermail/chat-lrug.org</a><br class="">Manage your subscription: <a href="http://lists.lrug.org/options.cgi/chat-lrug.org" target="_blank" class="">http://lists.lrug.org/options.cgi/chat-lrug.org</a><br class="">List info: <a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" target="_blank" class="">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br class=""></span></div></blockquote></div><br class=""></div></div><br class="">_______________________________________________<br class="">
Chat mailing list<br class="">
<a href="mailto:Chat@lists.lrug.org" class="">Chat@lists.lrug.org</a><br class="">
Archives: <a href="http://lists.lrug.org/pipermail/chat-lrug.org" rel="noreferrer" target="_blank" class="">http://lists.lrug.org/pipermail/chat-lrug.org</a><br class="">
Manage your subscription: <a href="http://lists.lrug.org/options.cgi/chat-lrug.org" rel="noreferrer" target="_blank" class="">http://lists.lrug.org/options.cgi/chat-lrug.org</a><br class="">
List info: <a href="http://lists.lrug.org/listinfo.cgi/chat-lrug.org" rel="noreferrer" target="_blank" class="">http://lists.lrug.org/listinfo.cgi/chat-lrug.org</a><br class="">
<br class=""></blockquote></div><br class=""></div>
_______________________________________________<br class="">Chat mailing list<br class=""><a href="mailto:Chat@lists.lrug.org" class="">Chat@lists.lrug.org</a><br class="">Archives: http://lists.lrug.org/pipermail/chat-lrug.org<br class="">Manage your subscription: http://lists.lrug.org/options.cgi/chat-lrug.org<br class="">List info: http://lists.lrug.org/listinfo.cgi/chat-lrug.org<br class=""></div></blockquote></div><br class=""></div></body></html>