View mode: basic / threaded / horizontal-split · Log in · Help
February 22, 2012
Adding overloaded methods
I'm working on a project where I'm using overloaded virtual methods, and I've
run into a challenge with overload sets.

My code looks something like this:

class Base {
void get(ubyte b) {};
}

class Derived: Base {
//alias Base.get get;
void get(string s) {};
}

I've tried using an alias declaration to combine the two classes' overload
sets in the derived class, but DMD complains that the alias conflicts with
get(string). Is there some reasonably elegant way around this, or is it a
limitation of the language?
February 22, 2012
Re: Adding overloaded methods
On Wednesday, February 22, 2012 02:21:43 BLM wrote:
> I'm working on a project where I'm using overloaded virtual methods, and
> I've run into a challenge with overload sets.
> 
> My code looks something like this:
> 
> class Base {
> void get(ubyte b) {};
> }
> 
> class Derived: Base {
> //alias Base.get get;
> void get(string s) {};
> }
> 
> I've tried using an alias declaration to combine the two classes' overload
> sets in the derived class, but DMD complains that the alias conflicts with
> get(string). Is there some reasonably elegant way around this, or is it a
> limitation of the language?

Hmm. That's how you're _supposed_ to do it. Sounds like a bug.

http://dlang.org/function.html

It may be related to the fact that you don't have override on the derived 
class's get though. You're really supposed to, but it hasn't been promoted to 
an error yet (it's enabled with -w until it is). Try that and see if it fixes 
it.

- Jonathan M Davis
February 22, 2012
Re: Adding overloaded methods
I tried using override and it complained that the functions weren't overriding
anything. I think that the main problem is that the alias solution was designed to
allow derived classes to use overloads that had already been defined in the base
class, not for the derived classes to add _new_ overloads. This might be good
material for an enhancement request.
February 22, 2012
Re: Adding overloaded methods
On Wednesday, February 22, 2012 02:50:41 BLM wrote:
> I tried using override and it complained that the functions weren't
> overriding anything. I think that the main problem is that the alias
> solution was designed to allow derived classes to use overloads that had
> already been defined in the base class, not for the derived classes to add
> _new_ overloads. This might be good material for an enhancement request.

I'd advise reporting it as a bug rather than an enhancement request. The whole 
point of using the alias is to bring all of the base class' overloads into the 
derived class' overload set. It shouldn't matter whether the derived class is 
adding overloads or just overriding a subset of the base class' overloads.

If the compiler devs really think that it's an enhancement request, then they
can change it, but it definitely looks like a bug to me.

- Jonathan M Davis
February 22, 2012
Re: Adding overloaded methods
On 02/21/2012 06:21 PM, BLM wrote:
> I'm working on a project where I'm using overloaded virtual methods, and I've
> run into a challenge with overload sets.
>
> My code looks something like this:
>
> class Base {
>   void get(ubyte b) {};
> }
>
> class Derived: Base {
>   //alias Base.get get;
>   void get(string s) {};
> }
>
> I've tried using an alias declaration to combine the two classes' overload
> sets in the derived class, but DMD complains that the alias conflicts with
> get(string). Is there some reasonably elegant way around this, or is it a
> limitation of the language?

Your code actually works with dmd 2.058:

import std.stdio;

class Base {
    void get(ubyte b) {
        writeln("get(ubyte)");
    }
}

class Derived: Base {
    alias Base.get get;
    void get(string s) {
        writeln("get(string)");
    }
}

void main()
{
    ubyte b;
    string s;

    auto o = new Derived();
    o.get(b);
    o.get(s);
}

Outputs:

get(ubyte)
get(string)

I have also corrected the indentation ;) and two extraneous semicolons.

Ali
February 22, 2012
Re: Adding overloaded methods
I've submitted it to the DMD developers. Hopefully it won't take too long to get
fixed; it looks like it would be a _fairly_ simple fix to make. (Since when is a
compiler fix simple?)
February 22, 2012
Re: Adding overloaded methods
Hmm... I guess I'll have to figure out why my code is behaving differently and put
a test case together. Strange...

Thanks for fixing the semicolons. Old C++ habits die hard, even if one has written
very little C++ :)
February 22, 2012
Re: Adding overloaded methods
On 2012-02-22 03:39, Jonathan M Davis wrote:
> On Wednesday, February 22, 2012 02:21:43 BLM wrote:
>> I'm working on a project where I'm using overloaded virtual methods, and
>> I've run into a challenge with overload sets.
>>
>> My code looks something like this:
>>
>> class Base {
>> void get(ubyte b) {};
>> }
>>
>> class Derived: Base {
>> //alias Base.get get;
>> void get(string s) {};
>> }
>>
>> I've tried using an alias declaration to combine the two classes' overload
>> sets in the derived class, but DMD complains that the alias conflicts with
>> get(string). Is there some reasonably elegant way around this, or is it a
>> limitation of the language?
>
> Hmm. That's how you're _supposed_ to do it. Sounds like a bug.
>
> http://dlang.org/function.html
>
> It may be related to the fact that you don't have override on the derived
> class's get though. You're really supposed to, but it hasn't been promoted to
> an error yet (it's enabled with -w until it is). Try that and see if it fixes
> it.
>
> - Jonathan M Davis

He is overloading, not overriding. You have to start notice the 
difference when reading these posts :)

-- 
/Jacob Carlborg
February 22, 2012
Re: Adding overloaded methods
On Wednesday, February 22, 2012 08:19:09 Jacob Carlborg wrote:
> He is overloading, not overriding. You have to start notice the
> difference when reading these posts :)

Well, it's both. He's overriding a base class function with a different 
signature. So, depending on how the compiler treats that, it could be 
considered either both an override and an overload or just an overload. And 
apparently the override attribute only applies to exact overloads.

- Jonathan M Davis
February 23, 2012
Re: Adding overloaded methods
After messing around for a while, I figured out what is making DMD choke on my
file. The methods were defined in the base class using template mixins, and
apparently DMD doesn't like it when mixins, inheritance, overloading, and aliases
are all in the same piece of code :)
« First   ‹ Prev
1 2
Top | Discussion index | About this forum | D home