override toString

Max Samukha spambox at d-coding.com
Thu Dec 3 02:27:31 PST 2009


On Thu, 03 Dec 2009 11:01:29 +0100, Qian Xu <qian.xu at funkwerk-itk.com>
wrote:

>Hi All,
>
>I want to print some object information for debugging. But the name of class 
>is incorrect. I do not know why.
>
>
>module test;
>
>class A {
>  char[] data;
>  public char[] toString() {
>    return "<" + this.classinfo.name + ": " + data + ">";
>  }
>}
>
>class B: A {
>  char[] data2;
>  public override char[] toString() {
>    return "<" + this.classinfo.name + ": " + super.toString + ", " + data2 
>+ ">";
>  }
>}
>
>auto b = new B;
>b.data = "hello";
>b.data2 = "world";
>Cout(b.toString); // <test.B: <test.B: hello>, world>
>
>
>The expected result should be:
><test.B: <test.A: hello>, world>
>
>But the actual result is:
><test.B: <test.B: hello>, world>
>
>

this.classinfo can be seen as a virtual function returning the
classinfo for the actual class instance and typeof(this).classinfo -
as a static function returning the classinfo of the compile-time type
of this (that is the class where it is called). So, your example
should be rewritten (D2):

import std.stdio;

class A {
  string data;
  public string toString() {
    return "<" ~ typeof(this).classinfo.name ~ ": " ~ data ~ ">";
  }
}

class B: A {
  string data2;
  public override string toString() {
    return "<" ~ typeof(this).classinfo.name ~ ": " ~ super.toString ~
", " ~ data2 ~ ">";
  }
}


void main()
{
    auto b = new B;
    b.data = "hello";
    b.data2 = "world";
    writeln(b.toString);
}


More information about the Digitalmars-d-learn mailing list