Thread overview |
---|
July 08, 2006 Is this a bug? | ||||
---|---|---|---|---|
| ||||
I have a class BaseWindow { Dimension2D size() { return _size; } abstract void size(Dimension2D size); } and derived class Win32Window : BaseWindow { void size(Dimension2D size) { _size.set(size); } } lets say i have a reference to class Win32Window. When i try to call method _window.size(), compiler complains it doesn't match arguments size(Dimension2D). Until i specify is to (cast(BaseWindow)_window).size(). Why?? |
July 08, 2006 Re: Is this a bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to freeagle | freeagle wrote: > I have a class BaseWindow > { > Dimension2D size() > { > return _size; > } > > abstract void size(Dimension2D size); > } > > and derived class Win32Window : BaseWindow > { > void size(Dimension2D size) > { > _size.set(size); > } > } > > lets say i have a reference to class Win32Window. When i try to call method _window.size(), compiler complains it doesn't match arguments size(Dimension2D). Until i specify is to (cast(BaseWindow)_window).size(). Why?? I don't remember the exact reason, but try aliasing 'size' from the BaseWindow's scope, like: class Win32Window : BaseWindow { void size(Dimension2D size) { ..... } alias super.size size; // iirc } -- Tomasz Stachowiak /+ a.k.a. h3r3tic +/ |
July 08, 2006 Re: Is this a bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tom S | Tom S wrote:
> freeagle wrote:
>> I have a class BaseWindow
>> {
>> Dimension2D size()
>> {
>> return _size;
>> }
>>
>> abstract void size(Dimension2D size);
>> }
>>
>> and derived class Win32Window : BaseWindow
>> {
>> void size(Dimension2D size)
>> {
>> _size.set(size);
>> }
>> }
>>
>> lets say i have a reference to class Win32Window. When i try to call method _window.size(), compiler complains it doesn't match arguments size(Dimension2D). Until i specify is to (cast(BaseWindow)_window).size(). Why??
>
> I don't remember the exact reason, but try aliasing 'size' from the BaseWindow's scope, like:
>
> class Win32Window : BaseWindow {
> void size(Dimension2D size) {
> .....
> }
>
> alias super.size size; // iirc
> }
>
>
the problem is not that i have to type a bit more to actually call the method, i just don't understand why its not part of Win32Window interface, when Win32Window class is publicly derived from BaseWindow defining public method Dimension2D size();
|
July 08, 2006 Re: Is this a bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to freeagle | freeagle wrote: > the problem is not that i have to type a bit more to actually call the method, i just don't understand why its not part of Win32Window interface, when Win32Window class is publicly derived from BaseWindow defining public method Dimension2D size(); That may be because of the symbol resolution method that is currently being attacked in various posts. In that one example of yours, the compiler figures out that you want a 'size' function of the Win32Window, it checks it and cant see the right version. It doesnt check the base class because of how the method resolution works. Weird, yeah :P -- Tomasz Stachowiak /+ a.k.a. h3r3tic +/ |
July 08, 2006 Re: Is this a bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to Tom S | Tom S wrote:
> freeagle wrote:
>> the problem is not that i have to type a bit more to actually call the method, i just don't understand why its not part of Win32Window interface, when Win32Window class is publicly derived from BaseWindow defining public method Dimension2D size();
>
> That may be because of the symbol resolution method that is currently being attacked in various posts. In that one example of yours, the compiler figures out that you want a 'size' function of the Win32Window, it checks it and cant see the right version. It doesnt check the base class because of how the method resolution works. Weird, yeah :P
>
>
well yeah, this way, you have to show whole inheritance tree to the user of the lib so he can use it. I think this damages encapsulation. I dont want the user to know there is a BaseWindow class, i want him to be happy just with a knowledge of Win32Window class.
|
July 09, 2006 Re: Is this a bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to freeagle | freeagle wrote: > Tom S wrote: >> freeagle wrote: >>> I have a class BaseWindow >>> { >>> Dimension2D size() >>> { >>> return _size; >>> } >>> >>> abstract void size(Dimension2D size); >>> } >>> >>> and derived class Win32Window : BaseWindow >>> { >>> void size(Dimension2D size) >>> { >>> _size.set(size); >>> } >>> } >>> >>> lets say i have a reference to class Win32Window. When i try to call method _window.size(), compiler complains it doesn't match arguments size(Dimension2D). Until i specify is to (cast(BaseWindow)_window).size(). Why?? >> >> I don't remember the exact reason, but try aliasing 'size' from the BaseWindow's scope, like: >> >> class Win32Window : BaseWindow { >> void size(Dimension2D size) { >> ..... >> } >> >> alias super.size size; // iirc >> } >> >> > > the problem is not that i have to type a bit more to actually call the method, i just don't understand why its not part of Win32Window interface, when Win32Window class is publicly derived from BaseWindow defining public method Dimension2D size(); The relevant doc specification, is on http://www.digitalmars.com/d/function.html , Function Inheritance and Overriding: "However, when doing overload resolution, the functions in the base class are not considered: [...] To consider the base class's functions in the overload resolution process, use an AliasDeclaration:" I'm also not sure if this is the ideal behavior. -- Bruno Medeiros - CS/E student http://www.prowiki.org/wiki4d/wiki.cgi?BrunoMedeiros#D |
July 09, 2006 Re: Is this a bug? | ||||
---|---|---|---|---|
| ||||
Posted in reply to freeagle | freeagle wrote:
> Tom S wrote:
>> freeagle wrote:
>>> the problem is not that i have to type a bit more to actually call the method, i just don't understand why its not part of Win32Window interface, when Win32Window class is publicly derived from BaseWindow defining public method Dimension2D size();
>>
>> That may be because of the symbol resolution method that is currently being attacked in various posts. In that one example of yours, the compiler figures out that you want a 'size' function of the Win32Window, it checks it and cant see the right version. It doesnt check the base class because of how the method resolution works. Weird, yeah :P
>>
>>
>
> well yeah, this way, you have to show whole inheritance tree to the user of the lib so he can use it. I think this damages encapsulation. I dont want the user to know there is a BaseWindow class, i want him to be happy just with a knowledge of Win32Window class.
ok, you dont, im taking back my last statements ;) thanks guys for the help
|
Copyright © 1999-2021 by the D Language Foundation