Thread overview
Is this a bug?
Jul 08, 2006
freeagle
Jul 08, 2006
Tom S
Jul 08, 2006
freeagle
Jul 08, 2006
Tom S
Jul 08, 2006
freeagle
Jul 09, 2006
freeagle
Jul 09, 2006
Bruno Medeiros
July 08, 2006
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
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
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
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
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
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
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