in reply to Composition Examples Sought

'Composition' as I understand it, simply refers to bringing in other objects to do tasks for you internally. Literally "an object inside another object".

In C++ this takes place through protected or private inheritance, or making an object a member. Obviously just making it a normal member is the less idiomatic way. Using inheritance for that essentially exports the interface of the internal object to outside users of the class. You have to do that explicitly if you want it done at all, with normal membership composition.

In Perl, I guess this would be something like $self->{obj} = new ObjectBlah; Simple as that.

--
Ash OS durbatulk, ash OS gimbatul,
Ash OS thrakatulk, agh burzum-ishi krimpatul!
Uzg-Microsoft-ishi amal fauthut burguuli.

Replies are listed 'Best First'.
Re: Re: Composition
by darrel3edndcom (Novice) on May 24, 2002 at 01:47 UTC
    ...sorry still in the dark...

    I can see how it is possible to export an interface, but I don't see how to do the other side of that and make a new object who's methods are composed of (references?) to other objects...

      Like I said, Composition is having an object inside another object. Where you go from there with respect to *accessing* the nested object is up to you!

      package MainObject; sub new { ... $self->{nested} = new NestedObject; ... } sub callNestedObjectMethod { my $self = shift; $self->{nested}->theMethod; }
      But you might not even do that. You might never export 'theMethod' in this fashion, it might only be internally used. The 'Composition' part is having NestedObject as a member of your class.

      It sounds like what you want is to "take object a, b, c and make a new object that lets me call methods from all of them". That sounds like private/protected inheritance in C++, and that sounds messy. Why not explicitly write your interface as above?

      --
      Ash OS durbatulk, ash OS gimbatul,
      Ash OS thrakatulk, agh burzum-ishi krimpatul!
      Uzg-Microsoft-ishi amal fauthut burguuli.