digitalmars.D - inheritance and override conflict
- GM (56/56) May 25 2006 I started learning D to day. In playing around I found this behavior whi...
 - Jarrett Billingsley (37/46) May 25 2006 Change the definition of WordWriter to the following:
 
I started learning D to day. In playing around I found this behavior which
seemed a little strange to me. As you can see below the Writer class has two
prints. If I override one of them in WordWriter then I can no longer see the
other without implicitly calling super. If I call writer.print("Yikes") in main
as below compilation fails because Writer.print(char[]) is no longer visible.
import std.stdio;
class Writer {
static this() {
x = 1;
y = 2;
z = 3;
}
this() {
writefln(x, y, z);
}
~this() {
writefln(z, y, x);	
}
void print(char[] o) {
writef(o);
}
abstract void print(char o) {
writef(o);
}
private:
static const int x, y, z;	
}
class WordWriter : Writer {
this() {
writefln("go");
}
~this() {
writefln("and");	
}
void printWords(char[] str) {
foreach(char c; str) {
if(c == ' ')
super.print("\n");
else
print(c);		
}
super.print("\n");	
}
override:
void print(char o) {
super.print(o);
}	
}
void main() {
char[] str = "Hello, World!"; 
void delegate(char[]) f;
WordWriter writer = new WordWriter();
f = &writer.printWords;
writer.print("Yikes");
f(str);
}
 May 25 2006
"GM" <GM_member pathlink.com> wrote in message 
news:e559gn$glk$1 digitaldaemon.com...
I started learning D to day. In playing around I found this behavior which
 seemed a little strange to me. As you can see below the Writer class has 
 two
 prints. If I override one of them in WordWriter then I can no longer see 
 the
 other without implicitly calling super. If I call writer.print("Yikes") in 
 main
 as below compilation fails because Writer.print(char[]) is no longer 
 visible.
Change the definition of WordWriter to the following:
class WordWriter : Writer
{
 this()
 {
  writefln("go");
 }
 ~this()
 {
  writefln("and");
 }
 void printWords(char[] str)
 {
  foreach(char c; str)
  {
   if(c == ' ')
   super.print("\n");
   else
   print(c);
  }
  super.print("\n");
 }
 alias Writer.print print;
 override void print(char o)
 {
  super.print(o);
 }
}
Notice the "alias Writer.print print."  This brings the "super" version of 
the print method into the namespace of the WordWriter class, so that it 
overloads with the other methods.
Also notice that if you were to put a colon after "override" it would make 
it apply to all subsequent method (and member) declarations, which might not 
be what you want.  Notice in my version that it only affects the "void 
print(char o)" declaration. 
 May 25 2006








 
 
 
 "Jarrett Billingsley" <kb3ctd2 yahoo.com>