Virtual Variable

Hi All,

I have these two class

class Base {
public int number = 1;

public override String ToString(){
return number.ToString();
}
}

class Derived : Base {
public new int number = 2;
}

static void Main(){
Base base = new Base();
Derived derived = new Derived();
Console.WriteLine(base.ToString());
Consolt.WriteLine(derived.ToString());
}

I was expecting to print out:
1
2

but I am getting:
1
1

Is there a work around to achieve what I was intended to do

Thank you,
Riady



Answer this question

Virtual Variable

  • Malleswar

    Try it like this:

    public class Base {
    private int mNumber = 1;
    public virtual int number {
    get { return mNumber; }
    }
    public override string ToString() {
    return number.ToString();
    }
    }

    public class Derived : Base {
    private int mNumber = 2;
    public override int number {
    get { return mNumber; }
    }
    }

    Note that this code works too:
    Base b = new Base();
    Console.WriteLine(b.ToString());
    b = new Derived();
    Console.WriteLine(b.ToString());



  • Jonathan Hart

    Declaring a constructor for the base class and derived class seems like it'd work, too. And if you decide later you want the Derived class to print "1" instead of "2", just remove or change the Derived class's constructor.

    Code sample:
    class Base
    {
    public int number;

    public Base()
    {
    number = 1;
    }

    public override String ToString()
    {
    return number.ToString();
    }
    }

    class Derived : Base
    {
    public Derived()
    {
    number = 2;
    }
    }

    class Program
    {
    static void Main(string[] args)
    {
    Base baseInstance = new Base();
    Derived derivedInstance = new Derived();
    Console.WriteLine(baseInstance.ToString());
    Console.WriteLine(derivedInstance.ToString());
    }
    }

    Output:
    1
    2


  • Tim Greenwood

    Hi,

    fields cannot behave like virtual functions. To get what you want you will need a virtual function GetNumber which you override in Derived. ToString must then use GetNumber and not the field number.

    --
    SvenC


  • Virtual Variable