tostring是object的方法,如果SaverAccount没有override的话venusAccount.ToString()就输出 SaverAccount,否则调用重载方法
解决方案 »
- 关于listview 或其他表格空间,想实现treeview的加号功能
- 控制台ip代理更换
- socket 异步通信的问题
- 请各位大侠帮忙: Object reference not set to an instance of an object.
- Calendar ???
- 十万火急--- 请进--->
- 第一次选择ListBox里的项时OnDrawItem会运行两次,为什么?
- 字符串或数组的有规则比较
- 如何在DataGrid中隐藏指定的列?
- 高手救我,C#链接数据库问题
- 被屏幕了的 MOUSE_EVEN 还有什么方法模拟鼠标?WINIO方式,模拟不成功(讨论下)
- 急问 在C#中 用什么方法可以检测进程的死锁
你可以删掉override Tostring()方法试试看..
又因为venusAccount对象是通过SaverAccount类来实例化的SaverAccount类重写了Object类的ToString()方法
所以说venusAccount对象访问的是重写后的ToString()方法。
实行了向上转型,所以SaverAccount中的方法ToString()在IBankAccount中并没有声明,而且ToString()方法是虚方法,接口中是不能声明的
{
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 . . .
ToString() 方法是对接口的一个扩展,虽然没在接口类中实现,但其实是一样的,都属于接口的方法
多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作,所以
Console.WriteLine(venusAccount.ToString())的时候venusAccount已经知道此对象是SaverAccount ,自然能找到override的方法了