How to override function?
Zarathustra
adam.chrapkowski at gmail.com
Thu Oct 22 12:47:04 PDT 2009
grauzone Wrote:
> Zarathustra wrote:
> > I would like to know, how to override function if subclass and super class are located in the same package and different modules.
> >
> > For instance when they are in the same module:
> > //___________________________________
> > module main;
> > class Foo{
> >
> > this(){
> > proc();
> > }
> >
> > void proc(){
> > writefln("Foo");
> > }
> > }
> >
> > class Bar : Foo{
> > override void proc(){
> > writefln("Bar");
> > }
> > }
> >
> > void main(){
> > new Bar;
> > }
> > //___________________________________
> > the result is "Bar" so it's great, but:
> >
> > //___________________________________
> > module pack.foo;
> >
> > class Foo{
> >
> > this(){
> > proc();
> > }
> >
> > package void proc(){ // without 'package' it works well
> > writefln("Foo");
> > }
> > }
> >
> > //___________________________________
> > module pack.bar;
> >
> > class Bar : Foo{
> > package override void proc(){ // without 'package' it works well
> > writefln("Bar");
> > }
> > }
> > //___________________________________
> > module main;
> > void main(){
> > new Bar;
> > }
> > //___________________________________
> > the result is "Foo" so it's unexpected to me.
>
> It's a bug. package functions are never virtual, and the "override"
> attribute is just ignored. Same with private. Welcome to D.
In my opinion 'private' shouldn't be virtual if sub- and sup- classes are located in different modules. Also if I have a global private function in the first module and the global function at the same name in the second module there shouldn't be conflict.
In C++ everything which is in 'source file', but not in 'header' it is nothing less than 'private'. I D it is impossible to 'hide' global function inside module (in my opinion it is bug).
I resolved 'package' function overriding problem as follow:
class Foo{
package void delegate() proc;
private void _proc(){ ... }
this(){
proc = &_proc;
}
package this(void delegete() o_proc){
proc = o_proc;
}
}
class Bar : Foo{
private void _proc(){ ... }
this(){
super(&_proc);
}
}
More information about the Digitalmars-d-learn
mailing list