Lack of `outer` keyword makes inner class dup implossible

S. Chancellor dnewsgr at mephit.kicks-ass.org
Sun Jul 16 12:58:21 PDT 2006


On 2006-07-16 08:19:04 -0700, Stewart Gordon <smjg_1998 at yahoo.com> said:

> Jarrett Billingsley wrote:
>> "Derek Parnell" <derek at psych.ward> wrote in message 
>> news:op.tcpklel16b8z09 at ginger.vic.bigpond.net.au...
>> 
>>> Excuse my ignorance, but what does an inner class provide that other 
>>> alternatives can't?
>> 
>> Well, what does a nested function provide that a separate, external 
>> function doesn't?
>> 
>> - Encapsulation
>> - Access to outer variables
> 
> Not just _access_ to outer variables, but the concept of outer 
> variables in the first place.
> 
>> - Is a Cool Thing (TM) ;)
> 
> An inner class is basically syntactic sugar for a static nested class 
> that includes a reference to an object of the enclosing class as one of 
> its members.  For example,
> 
>      class Board {
>          class Cell {
>              this() {
>                  ...
>              }
>          }
>      }
> 
> is equivalent to
> 
>      class Board {
>          static class Cell {
>              private Board _outer;
>              this(Board b) {
>                  _outer = b;
>                  ...
>              }
>          }
>      }
> 
> However, when using the static nested class approach, referring to the 
> whole of the 'enclosing' object, and not just to a specific member 
> thereof, becomes trivial.  OTOH, to access the outer object from an 
> inner class, you have to create a property in the outer class
> 
>      class Board {
>          Board theBoard() { return this; }
>      }
> 
> and then use it within the inner class.  This is a pinch of salt in the 
> syntactic sugar that is inner classes.  An 'outer' keyword would indeed 
> be nicer.
> 
> You could ask what access level outer should have.  For example, should
> it be acceptable to do, from outside, something like this?
> 
>      Cell c;
>      ...
>      Board b = c.outer;
> 
> Stewart.

Exactly.  Interestingly though I tried this:

class Board {
	Board outer;
	this() { outer = this; }
	class Cell {
		Cell dup() {
			return new outer.Cell;
		}
	}

and I get syntax errors.   This new expression stuff seems broken.




More information about the Digitalmars-d mailing list