这样申明有什么意思:“父类 变量 = new 父类的派生类”

chinasg 2006-10-19 05:13:40
在看《C#高级编程》,想问一下这样申明有什么意思:“父类 变量 = new 父类的派生类”?
如果这样申明,此时调用派生类自己特有的的方法、属性,编译就不能通过:变量.派生类特有的属性(方法)。 我的理解是,此时变量只能调用父类里面存在的东西?! 有什么实际的应用意义么?能用实列说明一下么?

对于书中145页的一句话,感到很别扭:

用一个基本引用指向派生类在语法上看起来很方便,但如果要使用派生类,这也是很基本的。可以理解为什么汽车电话公司要存储Customer派生的各种类。在那个例子中,只有两个顾客,所以很容易定义不同的变量,但实际的顾客有成百上千个,可以用一组数组来处理它们,可以使用下面的代码:
Customer [] Customers=new Customer[NCustomers];

//do something to initialize customers

foreach (Customer NextCustomers in Customers)
{
Console.WriteLine("{0,-20} owes ${1:F2})",NextCustomer.Name,NextCustomer.Balance);

}

在Customer引用数组中,无论用什么样的Customer派生类来表示客户,每个元素都可以指向任何类型的顾客。但是,如果变量不能存储派生类的引用,我们就必须有许多数组:一个Customer数组,一个Nevermore60Customers数组,以积累的每种类型的一个数组。这就是我们的方法:对于任何问题使用不能工作的派生类。
我们可以保证能把不同类型的类混合在一个数组中,但这会给编译器带来一个新的问题……


这段话,有许多疑问:
1、"但如果要使用派生类,这也是很基本的",什么很基本的?
2、这段代码中“Customer [] Customers=new Customer[NCustomers];”,都已经使用Customer类来定义、而且分配内存空间,怎么还能区别Customers数组里面的每个元素具体是Customer类还是Customer的派生类?



谢谢!
...全文
246 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
itmingong 2006-10-20
  • 打赏
  • 举报
回复
学习了
chinasg 2006-10-20
  • 打赏
  • 举报
回复
第一个问题多谢 TomMax(笑望人生) 详细解释。也多谢楼上各位!结贴!

困惑更多的是: Customer [] Customers=new Customer[NCustomers]的应用,我重新发帖询问吧。
marvelstack 2006-10-20
  • 打赏
  • 举报
回复
看工厂设计模式,在父类有多个子类的情况下实例化子类并由父类型指向,
或多个类实现某个接口,实例化多个类由接口指向,提高代码的重用性。或为上层调用组件提供一致的访问接口。
  • 打赏
  • 举报
回复
这是多态的应用,应用的场合很简单,就是在需要一个类解决多个问题的情况下使用。

比如说数据库,现在市场上有多个数据库,SqlServer, Access, Oracle,DB2等,而你在开发程序的时候为了解决程序的兼容性和可移植性,需要支持多种类型不同的数据库,而程序开发部署后,你不知道客户使用的是那个种类的数据库。

这时候,就必须要使用简单工厂模式使用OO的多态来解决这个问题。

比如说你建立一个基类,它是所有类型的数据库的父类,这个类中的操作数据库的具体方法可以使用虚拟方法来解决:

public abstract class Database : IDispoable
{
// 数据库执行方法,如获取DataSet
public abstract DataSet ExecuteDataSet(...);
}

而在建立具体的数据库应用的时候,就可以这样写:

public sealed class OracleDatabase : Database
{
public override DataSet ExecuteDataSet(...)
{
// 使用Oracle 数据库的DataSet 方法
}
}

还有别的数据库

public sealed class Db2Database : Database
{
public override DataSet ExecuteDataSet(...)
{
// 使用 Db2 数据库的DataSet 方法
}
}

这样,你希望支持多少种数据库,你就派生多少个这样的类。

但是你不知道客户使用的是什么数据库,这样你必须使用如配置文件或注册表这样的保存配置的系统,通过它建立一个配置窗口,让客户自己去选择,然后把使用数据库的方法来保存到存储配置的地方。

然后就得用工厂类来生成具体使用数据库的类实例了,工厂类就是专门生产类的一个类,它的使用很简单,就是通过查看配置存储,然后通过判断来建立类:

public static DatabaseFactory
{
public static Database GetCurrentDatabase()
{
// 访问配置,
switch(配置变量)
{
case (Sql Server 数据库):
return new SqlServerDatabase();
case (Oracle数据库) :
return new OracleDatabase;
case (Db2数据库) :
return new Db2Database();
// 等等
}
}
}

这样,贴主的第一个问题:
父类 变量 = new 父类的派生类

不过就是:
Database sql = new SqlServerDatabase(); 或者
Database oracle = new OracleDatabase();

这样,虽然变量的代码类别虽然是“Database”类,但是在内存中,它却是派生类。
最后一只恐龙 2006-10-19
  • 打赏
  • 举报
回复
对象是子类的实例,父类变量只是一个记号,便于与其它子类对象统一处理。
父类变量需要时可以强制类型转换为new的子类类型,而且调用函数虚函数时,如果子类实现了虚函数,则调用子类的,如果没有实现,调用父类的。
aafshzj 2006-10-19
  • 打赏
  • 举报
回复
1)有时候,我们希望类型可以通过继承扩展,我们赋予其它人这种权利,但我们不关心它通过集成扩展了什么,只要它的原有特征(基类型的属性、方法)不便就可以,我们就把他当基类型使用。这样,就实现了原有代码只依赖于原基类型,而不依赖于衍生类型并且允许基类型通过继承扩展的特性。

2)那些依赖于扩展的衍生类型的属性和方法的代码才关心它的具体衍生类型是什么。而这样的代码一定是在衍生类型的属性方法约定确定之后或同步开发的,换句话说,这些代码依赖于衍生类型。

欢迎大家来我的博客作客:http://blog.csdn.net/aafshzj/
我正在写一系列关于AAF组件框架的文章。该框架能对开发工作提供很多帮助,并极大地提高开发效率。希望大家看一看并提出宝贵建议。
dyhml 2006-10-19
  • 打赏
  • 举报
回复
一般这样应用:

父类 变量 = 父类Factory();

这时不知道 父类Factory() 返回的是哪一个子类,只知道肯定可以用 父类。

这就是多态最典型应用,工厂方法
scow 2006-10-19
  • 打赏
  • 举报
回复
当有多个父类的派生类时.................
loveyzy 2006-10-19
  • 打赏
  • 举报
回复
OO的多态
Nara 2006-10-19
  • 打赏
  • 举报
回复
这样new出来的变量可以传递给专门以各种父类的派生类作为参数的处理类来进行工厂式的加工
viena 2006-10-19
  • 打赏
  • 举报
回复
1这也是很基本的,也不明白啥意思

2不需要区别
viena 2006-10-19
  • 打赏
  • 举报
回复
楼主知不知道多态?

110,549

社区成员

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

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

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