dynamic classes and duck typing

Denis Koroskin 2korden at gmail.com
Tue Dec 1 03:02:37 PST 2009


On Tue, 01 Dec 2009 09:33:40 +0300, Walter Bright  
<newshound1 at digitalmars.com> wrote:

> Andrei Alexandrescu wrote:
>> Bill Baxter wrote:
>>> On Mon, Nov 30, 2009 at 7:12 PM, Walter Bright
>>> <newshound1 at digitalmars.com> wrote:
>>>> Bill Baxter wrote:
>>>>> So we can overload on @property-ness?
>>>> No.
>>>>
>>>>> I.e. this works
>>>>>
>>>>> struct S
>>>>> {
>>>>> @property
>>>>> float x() { return 1.0f; }
>>>>> float x() { return 2.0f; }
>>>>> }
>>>>>
>>>>> void main()
>>>>> {
>>>>>    S  s;
>>>>>    writefln("%s", s.x); // writes 1.0
>>>>>    writefln("%s", s.x()); // writes 2.0
>>>>> }
>>>> That just looks wrong.
>>>>
>>>
>>> Ok, so you can't have both dynamic properties and dynamic methods with
>>> this.  One or the other, your pick.
>>> Seems like an unfortunate limitation.
>>>
>>> --bb
>>  It's a limitation similar to not having a field and a method share the  
>> same name. It avoids a number of awkward questions such as figuring the  
>> meaning of &s.x.
>
> I agree. While the compiler currently doesn't check for mixing up  
> properties and methods, I intend to make it do so. I can't see any  
> justification for allowing it.

Monkey-patching relies on it:

int bar() { return 42; }

Dynamic dynamic = new Dynamic();

dynamic.newMethod = &bar; // setter, @property version called
auto dg = dynamic.newMethod; // getter, @property version called

auto result = dynamic.newMethod(); // non- at property version called



More information about the Digitalmars-d mailing list