接口和ToString()

老蒋 2009-07-14 12:52:36
interface IBankAccount
{
void PayIn(decimal amount);
}


class SaverAccount : IBankAccount
{
public void PayIn(decimal amount)
{
balance += amount;
}

public override string ToString()
{
return String.Format("Venus Bank Saver:Balance={0,6:C}", balance);
}
}


IBankAccount venusAccount = new SaverAccount();
venusAccount.PayIn(300);
Console.WriteLine(venusAccount.ToString());
竟然venusAccount可以调用SaverAccount类中的Tostring方法,不能理解,因为venusAccount 声明为IBankAccount变量,怎么可以调用 SaverAccount 类中IBankAccount没有的方法ToString()方法,哪位可以解释一下?
...全文
58 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
dazhabai 2009-07-14
  • 打赏
  • 举报
回复
这个问题的是由面向对象的多态解决的
多态性使得能够利用同一类(基类)类型的指针来引用不同类的对象,以及根据所引用对象的不同,以不同的方式执行相同的操作,所以
Console.WriteLine(venusAccount.ToString())的时候venusAccount已经知道此对象是SaverAccount ,自然能找到override的方法了
sl2161 2009-07-14
  • 打赏
  • 举报
回复
接口本质上也是抽象类
老蒋 2009-07-14
  • 打赏
  • 举报
回复
接口和抽象类是有区别的,接口中是不能有虚方法的
xhueducls 2009-07-14
  • 打赏
  • 举报
回复
所有类型都是继承 object的,tostring()是object的一个虚方法,所以所有子类都有这个方法,你还可以重写它。
accpyy 2009-07-14
  • 打赏
  • 举报
回复
6楼的例子已经可以说明一切了

要扩展或修改继承的方法、属性、索引器或事件的抽象实现或虚实现,必须使用 override 修饰符。
ToString() 方法是对接口的一个扩展,虽然没在接口类中实现,但其实是一样的,都属于接口的方法
老蒋 2009-07-14
  • 打赏
  • 举报
回复
问题是IBankAccount中我都没有这个ToString()方法声明,IBankAccount变量怎么可以调用ToString()
十八道胡同 2009-07-14
  • 打赏
  • 举报
回复
语言通常不要求类声明从 Object 的继承,因为继承是隐式的。

因为 .NET Framework 中的所有类均从 Object 派生,所以 Object 类中定义的每个方法可用于系统中的所有对象。派生类可以而且确实重写这些方法中的某些,其中包括:

Equals — 支持对象间的比较。

Finalize — 在自动回收对象之前执行清理操作。

GetHashCode — 生成一个与对象的值相对应的数字以支持哈希表的使用。

ToString — 生成描述类的实例的可读文本字符串。
十八道胡同 2009-07-14
  • 打赏
  • 举报
回复
 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 . . .
老蒋 2009-07-14
  • 打赏
  • 举报
回复
首先谢谢大家的点评,但是声明这样的的,IBankAccount venusAccount = new SaverAccount();
实行了向上转型,所以SaverAccount中的方法ToString()在IBankAccount中并没有声明,而且ToString()方法是虚方法,接口中是不能声明的
hecker728 2009-07-14
  • 打赏
  • 举报
回复
Object类是所有对象的基类,他有方法 ToString()。

venusAccount对象可以访问ToString()。
又因为venusAccount对象是通过SaverAccount类来实例化的

SaverAccount类重写了Object类的ToString()方法
所以说venusAccount对象访问的是重写后的ToString()方法。
十八道胡同 2009-07-14
  • 打赏
  • 举报
回复
所有的类都是object的子类,object类里有toString()的实现.
你可以删掉override Tostring()方法试试看..
dsr456 2009-07-14
  • 打赏
  • 举报
回复
SaverAccount 这个类是继承基类System。Object类的,这个类就有ToString方法
yanleiyigan 2009-07-14
  • 打赏
  • 举报
回复
tostring是object的方法,如果SaverAccount没有override的话venusAccount.ToString()就输出 SaverAccount,否则调用重载方法

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧