tostring是object的方法,如果SaverAccount没有override的话venusAccount.ToString()就输出 SaverAccount,否则调用重载方法

解决方案 »

  1.   

    SaverAccount 这个类是继承基类System。Object类的,这个类就有ToString方法
      

  2.   

    所有的类都是object的子类,object类里有toString()的实现.
    你可以删掉override Tostring()方法试试看..
      

  3.   

    Object类是所有对象的基类,他有方法 ToString()。venusAccount对象可以访问ToString()。
    又因为venusAccount对象是通过SaverAccount类来实例化的SaverAccount类重写了Object类的ToString()方法
    所以说venusAccount对象访问的是重写后的ToString()方法。
      

  4.   

    首先谢谢大家的点评,但是声明这样的的,IBankAccount venusAccount = new SaverAccount(); 
    实行了向上转型,所以SaverAccount中的方法ToString()在IBankAccount中并没有声明,而且ToString()方法是虚方法,接口中是不能声明的
      

  5.   

     interface IBankAccount
            {
                void PayIn(decimal amount);
            }        class SaverAccount : IBankAccount
            {
                private decimal balance;
                public void PayIn(decimal amount)
                {
                    balance += amount;
                }            public override string ToString()
                {
                    return String.Format("Venus Bank Saver:Balance={0,6:C}", balance);
                }
            }        static void Main(string[] args)
            {
                IBankAccount venusAccount = new SaverAccount();
                venusAccount.PayIn(300);
                Console.WriteLine(venusAccount.ToString());         } 输出:Venus Bank Saver:Balance=$300.00
    Press any key to continue . . . interface IBankAccount
            {
                void PayIn(decimal amount);
            }        class SaverAccount : IBankAccount
            {
                private decimal balance;
                public void PayIn(decimal amount)
                {
                    balance += amount;
                }            //public override string ToString()
                //{
                //    return String.Format("Venus Bank Saver:Balance={0,6:C}", balance);
                //}
            }        static void Main(string[] args)
            {
                IBankAccount venusAccount = new SaverAccount();
                venusAccount.PayIn(300);
                Console.WriteLine(venusAccount.ToString());         }
    输出:ConsoleApplication15.Program+SaverAccount
    Press any key to continue . . .
      

  6.   

    语言通常不要求类声明从 Object 的继承,因为继承是隐式的。因为 .NET Framework 中的所有类均从 Object 派生,所以 Object 类中定义的每个方法可用于系统中的所有对象。派生类可以而且确实重写这些方法中的某些,其中包括: Equals — 支持对象间的比较。Finalize — 在自动回收对象之前执行清理操作。GetHashCode — 生成一个与对象的值相对应的数字以支持哈希表的使用。ToString — 生成描述类的实例的可读文本字符串。
      

  7.   

    问题是IBankAccount中我都没有这个ToString()方法声明,IBankAccount变量怎么可以调用ToString()
      

  8.   

    6楼的例子已经可以说明一切了要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
    ToString() 方法是对接口的一个扩展,虽然没在接口类中实现,但其实是一样的,都属于接口的方法
      

  9.   

    所有类型都是继承 object的,tostring()是object的一个虚方法,所以所有子类都有这个方法,你还可以重写它。
      

  10.   

    这个问题的是由面向对象的多态解决的
    多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作,所以
    Console.WriteLine(venusAccount.ToString())的时候venusAccount已经知道此对象是SaverAccount ,自然能找到override的方法了