Thread overview
Accessing this of containing class
Feb 03, 2011
Mandeep Singh Brar
Feb 03, 2011
Jonathan M Davis
Feb 03, 2011
Jacob Carlborg
Feb 03, 2011
Jonathan M Davis
Feb 03, 2011
Ary Manzana
Feb 03, 2011
Jonathan M Davis
February 03, 2011
Hi,

Is there a method to access this reference of the container class
from an inner class. i.e.
class A {
class B {
   methodM() {
      callAnotherM(A::this or A.this);
   }
}
}

Thanks
Mandeep
February 03, 2011
On Wednesday 02 February 2011 21:26:00 Mandeep Singh Brar wrote:
> Hi,
> 
> Is there a method to access this reference of the container class
> from an inner class. i.e.
> class A {
> class B {
>    methodM() {
>       callAnotherM(A::this or A.this);
>    }
> }
> }

The outer class is referenced via the property outer. However, if the inner class is static, then it has no such property and is not tied to a specific instance of the outer class. In such a case, it can access the private members of an instance of the outer class, but it's not tied to an particular instance. Non-static inner classes (like yours above), however, _are_ tied to a particular instance of the outer class, and they have the outer property which is the this of the outer class.

- Jonathan M Davis
February 03, 2011
On 2011-02-03 07:21, Jonathan M Davis wrote:
> On Wednesday 02 February 2011 21:26:00 Mandeep Singh Brar wrote:
>> Hi,
>>
>> Is there a method to access this reference of the container class
>> from an inner class. i.e.
>> class A {
>> class B {
>>     methodM() {
>>        callAnotherM(A::this or A.this);
>>     }
>> }
>> }
>
> The outer class is referenced via the property outer. However, if the inner
> class is static, then it has no such property and is not tied to a specific
> instance of the outer class. In such a case, it can access the private members
> of an instance of the outer class, but it's not tied to an particular instance.
> Non-static inner classes (like yours above), however, _are_ tied to a particular
> instance of the outer class, and they have the outer property which is the this
> of the outer class.
>
> - Jonathan M Davis

Just to add a note, you have to access the property via "this":

this.outer

-- 
/Jacob Carlborg
February 03, 2011
On Thursday 03 February 2011 00:38:08 Jacob Carlborg wrote:
> On 2011-02-03 07:21, Jonathan M Davis wrote:
> > On Wednesday 02 February 2011 21:26:00 Mandeep Singh Brar wrote:
> >> Hi,
> >> 
> >> Is there a method to access this reference of the container class
> >> from an inner class. i.e.
> >> class A {
> >> class B {
> >> 
> >>     methodM() {
> >> 
> >>        callAnotherM(A::this or A.this);
> >> 
> >>     }
> >> 
> >> }
> >> }
> > 
> > The outer class is referenced via the property outer. However, if the inner class is static, then it has no such property and is not tied to a specific instance of the outer class. In such a case, it can access the private members of an instance of the outer class, but it's not tied to an particular instance. Non-static inner classes (like yours above), however, _are_ tied to a particular instance of the outer class, and they have the outer property which is the this of the outer class.
> > 
> > - Jonathan M Davis
> 
> Just to add a note, you have to access the property via "this":
> 
> this.outer

That, I did not know. But I've never actually used an inner class in D thus far. I just read what TDPL says on it, and obviously I missed that point. Thanks.

- Jonathan M Davis
February 03, 2011
On Thu, 03 Feb 2011 03:43:43 -0500, Jonathan M Davis <jmdavisProg@gmx.com> wrote:

> On Thursday 03 February 2011 00:38:08 Jacob Carlborg wrote:
>> On 2011-02-03 07:21, Jonathan M Davis wrote:
>> > On Wednesday 02 February 2011 21:26:00 Mandeep Singh Brar wrote:
>> >> Hi,
>> >>
>> >> Is there a method to access this reference of the container class
>> >> from an inner class. i.e.
>> >> class A {
>> >> class B {
>> >>
>> >>     methodM() {
>> >>
>> >>        callAnotherM(A::this or A.this);
>> >>
>> >>     }
>> >>
>> >> }
>> >> }
>> >
>> > The outer class is referenced via the property outer. However, if the
>> > inner class is static, then it has no such property and is not tied  
>> to a
>> > specific instance of the outer class. In such a case, it can access  
>> the
>> > private members of an instance of the outer class, but it's not tied  
>> to
>> > an particular instance. Non-static inner classes (like yours above),
>> > however, _are_ tied to a particular instance of the outer class, and
>> > they have the outer property which is the this of the outer class.
>> >
>> > - Jonathan M Davis
>>
>> Just to add a note, you have to access the property via "this":
>>
>> this.outer
>
> That, I did not know. But I've never actually used an inner class in D thus far.
> I just read what TDPL says on it, and obviously I missed that point. Thanks.

I have noticed that, is that a bug?  I always thought it strange, since outer is a keyword, that you need to do this.outer.

-Steve
February 03, 2011
On 2/3/11 10:29 AM, Steven Schveighoffer wrote:
> On Thu, 03 Feb 2011 03:43:43 -0500, Jonathan M Davis
> <jmdavisProg@gmx.com> wrote:
>
>> On Thursday 03 February 2011 00:38:08 Jacob Carlborg wrote:
>>> On 2011-02-03 07:21, Jonathan M Davis wrote:
>>> > On Wednesday 02 February 2011 21:26:00 Mandeep Singh Brar wrote:
>>> >> Hi,
>>> >>
>>> >> Is there a method to access this reference of the container class
>>> >> from an inner class. i.e.
>>> >> class A {
>>> >> class B {
>>> >>
>>> >> methodM() {
>>> >>
>>> >> callAnotherM(A::this or A.this);
>>> >>
>>> >> }
>>> >>
>>> >> }
>>> >> }
>>> >
>>> > The outer class is referenced via the property outer. However, if the
>>> > inner class is static, then it has no such property and is not tied
>>> to a
>>> > specific instance of the outer class. In such a case, it can access
>>> the
>>> > private members of an instance of the outer class, but it's not
>>> tied to
>>> > an particular instance. Non-static inner classes (like yours above),
>>> > however, _are_ tied to a particular instance of the outer class, and
>>> > they have the outer property which is the this of the outer class.
>>> >
>>> > - Jonathan M Davis
>>>
>>> Just to add a note, you have to access the property via "this":
>>>
>>> this.outer
>>
>> That, I did not know. But I've never actually used an inner class in D
>> thus far.
>> I just read what TDPL says on it, and obviously I missed that point.
>> Thanks.
>
> I have noticed that, is that a bug? I always thought it strange, since
> outer is a keyword, that you need to do this.outer.
>
> -Steve

I don't think outer is a keyword.
February 03, 2011
On Thursday, February 03, 2011 10:36:29 Ary Manzana wrote:
> On 2/3/11 10:29 AM, Steven Schveighoffer wrote:
> > On Thu, 03 Feb 2011 03:43:43 -0500, Jonathan M Davis
> > 
> > <jmdavisProg@gmx.com> wrote:
> >> On Thursday 03 February 2011 00:38:08 Jacob Carlborg wrote:
> >>> On 2011-02-03 07:21, Jonathan M Davis wrote:
> >>> > On Wednesday 02 February 2011 21:26:00 Mandeep Singh Brar wrote:
> >>> >> Hi,
> >>> >> 
> >>> >> Is there a method to access this reference of the container class
> >>> >> from an inner class. i.e.
> >>> >> class A {
> >>> >> class B {
> >>> >> 
> >>> >> methodM() {
> >>> >> 
> >>> >> callAnotherM(A::this or A.this);
> >>> >> 
> >>> >> }
> >>> >> 
> >>> >> }
> >>> >> }
> >>> > 
> >>> > The outer class is referenced via the property outer. However, if the inner class is static, then it has no such property and is not tied
> >>> 
> >>> to a
> >>> 
> >>> > specific instance of the outer class. In such a case, it can access
> >>> 
> >>> the
> >>> 
> >>> > private members of an instance of the outer class, but it's not
> >>> 
> >>> tied to
> >>> 
> >>> > an particular instance. Non-static inner classes (like yours above), however, _are_ tied to a particular instance of the outer class, and they have the outer property which is the this of the outer class.
> >>> > 
> >>> > - Jonathan M Davis
> >>> 
> >>> Just to add a note, you have to access the property via "this":
> >>> 
> >>> this.outer
> >> 
> >> That, I did not know. But I've never actually used an inner class in D
> >> thus far.
> >> I just read what TDPL says on it, and obviously I missed that point.
> >> Thanks.
> > 
> > I have noticed that, is that a bug? I always thought it strange, since outer is a keyword, that you need to do this.outer.
> > 
> > -Steve
> 
> I don't think outer is a keyword.

It's not a keyword. It's a property of non-static inner classes. It's like length on an array. It's always there, but it's not a keyword.

- Jonathan M Davis
February 03, 2011
On Thu, 03 Feb 2011 13:53:22 -0500, Jonathan M Davis <jmdavisProg@gmx.com> wrote:

> On Thursday, February 03, 2011 10:36:29 Ary Manzana wrote:
>> On 2/3/11 10:29 AM, Steven Schveighoffer wrote:
>> >
>> > I have noticed that, is that a bug? I always thought it strange, since
>> > outer is a keyword, that you need to do this.outer.
>> >
>> > -Steve
>>
>> I don't think outer is a keyword.
>
> It's not a keyword. It's a property of non-static inner classes. It's like
> length on an array. It's always there, but it's not a keyword.

You're right, it isn't.  My text editor highlights it like it is, so I just assumed...

My question still stands though, why the requirement to use this.outer instead of just outer?

-Steve