dynamic classes and duck typing
Denis Koroskin
2korden at gmail.com
Tue Dec 1 05:49:58 PST 2009
On Tue, 01 Dec 2009 16:46:25 +0300, Steven Schveighoffer
<schveiguy at yahoo.com> wrote:
> On Mon, 30 Nov 2009 23:32:21 -0500, Bill Baxter <wbaxter at gmail.com>
> 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.
>
>
> what a minute, can't you use template conditionals to distinguish? i.e.
> I would expect this to work:
>
> struct S
> {
> @property float opDispatch(string s)() if (s == "x") {return 1.0f;}
> float opDispatch(string s)() { return 2.0f;}
> }
>
> void main()
> {
> S s;
> writefln("%s", s.x); // 1.0
> writefln("%s", s.y()); // 2.0
> }
>
> Overloading opDispatch based on the called symbol name should always be
> possible, and overloading on parameter types is always possible.
>
> -Steve
What if you don't know argument names a-priori? Consider a generic Dynamic
class that has nothing but a single opDispatch method.
More information about the Digitalmars-d
mailing list