Overloading static methods

Steven Schveighoffer schveiguy at yahoo.com
Tue Aug 30 08:58:20 PDT 2011


On Tue, 30 Aug 2011 11:38:54 -0400, Andrei Alexandrescu  
<SeeWebsiteForEmail at erdani.org> wrote:

> On 8/30/11 7:34 AM, Steven Schveighoffer wrote:
>> On Tue, 30 Aug 2011 07:53:15 -0400, Steven Schveighoffer
>> <schveiguy at yahoo.com> wrote:
>>
>>> On Mon, 29 Aug 2011 10:59:22 -0400, Daniel Murphy
>>> <yebblies at nospamgmail.com> wrote:
>>>
>>>> "Steven Schveighoffer" <schveiguy at yahoo.com> wrote in message
>>>> news:op.v0zckubyeav7ka at localhost.localdomain...
>>>>>
>>>>> My opinion is that static methods should *not* be callable from an
>>>>> instance, you should need typeof(instance).staticMethod. The current
>>>>> allowance is misleading.
>>>>>
>>>>> This should solve some of the issues, but of course, you'd need to
>>>>> allow
>>>>> overloading of the method name in static and non-static forms.
>>>>>
>>>>> -Steve
>>>>
>>>> I like this idea. Is there a bugzilla entry for it?
>>>
>>> I'll add it, if it's not already there.
>>
>> http://d.puremagic.com/issues/show_bug.cgi?id=6579
>>
>> -Steve
>
> I'll note that calls of static methods for instances has been a boon to  
> generic programming in C++. People could call a method and it was up to  
> the implementation whether it was static or not.

Yes, you are right.  But there is an ugly flip side to that coin.

The issue is, when someone designs a static method to be called on an  
*instance*, it makes sense.  But when someone designs a static method to  
be called on the *type* (which is predominantly how I write them), it  
often does not make any sense to call it on the instance.  Yet, the  
compiler still compiles.

An example I gave in the bug report just now is File.  Imagine you have a  
File struct, and want to have an open method:

struct File
{
    static File open(string fname);
}

However, now this is valid code:

File f;
f.open(fname);  // does not do what you think it does...

I agree there are ways to design around this, but the fact that the  
intentions of the designer are not upheld (and cannot be) by the compiler  
is troubling to me.  I *named* the function expecting it to be called a  
certain way, yet confusion abounds when called some way I didn't intend or  
anticipate.  One seldom thinks of the instance-calling-static mechanism  
when designing a static method that is meant to be called with the type.

> We don't have as big a problem in D due to introspection. I fear,  
> however, that we'll need to add static if (...) obj.method(); else  
> typeof(obj).method();
>
> I don't see an improvement.

In terms of generic programming, you have a good point.  I don't see a  
good way around this without altering syntax.

Perhaps we could do something like this (a la recently added @disable  
this):

struct File
{
    static File open(string fname);

    @disable open; // disable calling from an instance
}

Yuck...  nevermind :)

-Steve


More information about the Digitalmars-d mailing list