Question about typeof(this)

Jacob Carlborg doob at me.com
Fri Sep 10 06:20:00 PDT 2010


On 2010-09-07 22:32, Don wrote:
> Jacob Carlborg wrote:
>> On 2010-09-07 17:29, Don wrote:
>>> Jacob Carlborg wrote:
>>>> I'm reading http://www.digitalmars.com/d/2.0/declaration.html#Typeof
>>>> where it says:
>>>>
>>>> "typeof(this) will generate the type of what this would be in a
>>>> non-static member function, even if not in a member function. "
>>>>
>>>> From that I got the impression that the code below would print the
>>>> same result, but it doesn't. It prints:
>>>>
>>>> main.Bar
>>>> main.Foo
>>>>
>>>> instead of:
>>>>
>>>> main.Foo
>>>> main.Foo
>>>>
>>>> Is this a bug or have I misunderstood the docs?
>>>
>>> typeof(this) gives the *compile-time* type of this. Inside Bar, it has
>>> to return 'Bar'.
>>> typeid(this) gives the *runtime* type of this. So it can work that it's
>>> Bar is actually a Foo.
>>
>> I know that typeof(this) is a compile time expression but in this case
>> I think the compiler has all the necessary information at compile
>> time. Note that I'm not calling "method" on a base class reference,
>> I'm calling it on the static type "Foo". In this case I think
>> typeof(this) would resolve to the type of the receiver, i.e. the type
>> of"foo".
>
> Even though in this instance it could work out which derived class is
> being used, it's not allowed to use that information while compiling
> method(). There is only ONE function method(), and it has to work for
> Bar, and all classes derived from Bar.

I think Scala can handle this problem, the following text is a snippet 
from a paper called "Scalable Component Abstractions" (link at the 
bottom), page 4 "Type selection and singleton types":

class C {
	protected var x = 0;
	def incr: this.type = { x = x + 1; this }
}

class D extends C {
	def decr: this.type = { x = x - 1; this }
}

"Then we can chain calls to the incr and decr method, as in

val d = new D; d.incr.decr;

Without the singleton type this.type, this would not have
been possible, since d.incr would be of type C, which does
not have a decr member. In that sense, this.type is similar
to (covariant uses of ) Kim Bruce's mytype construct [5]."

I'm not very familiar with Scala but the above code example seems to 
work as I want typeof(this) to work.

http://www.scala-lang.org/sites/default/files/odersky/ScalableComponent.pdf

-- 
/Jacob Carlborg


More information about the Digitalmars-d-learn mailing list