static void Main(string[] args)
{
A a = new A();
B b =new B();
b.a = 300;
b.b = 20;
B e = a.Clone() as B;//这里会运行错误 但是变成b.clone() as B 就会正常
System.Console.WriteLine(e.a);
}
这段代码代码的分析很简单:
a.Clone()得到的仍然是一个A类型的对象。A是基类,所以基类是无法强制转换成派生类的。
b.Clone()得到的就B类型的对象了。所以可以AS B。给你一个例子:
A a = new A();
B b = new B();
A a2 = b; //这是可以的。
B b2 = a2 as B; //这种强制转换也是可以成功的。
解决方案 »
- 请大家看下这个构造函数问题。。。
- 请问有办法为自定义属性头传入变量参数吗?
- VS2005下面如何声明服务器控件和服务器事件?
- 小弟做了个CPU使用率曲线图 使用performanceCounter1组件 访问远程主机的时候出异常(拒绝访问)System.ComponentModel.Win32Exception
- 如何从PDF文件里提取文本出来?
- 这个函数为什么不可以返回一个小数点后面有两个数字的 double
- 请教各位高手如何在c#中显示多页的tif 格式的文件呀,用picturebox 只能显示第一页, 使用printdocument 打印时也只能打印一页
- 请大家告诉我如何把做好的程序移植到其他机器上,并使之正常运行
- 请问怎么能返回一个数组?
- .net fileupload上传到项目的Excel破损
- C# 解析图片二进制流的控件
- c# Socket 文件传输 服务器与客户端 双向传输的实现方法???
这是因为你实例化的对象本身就是B,B相当包含A存在.所以可以转B e = a.Clone() as B;//这里会运行错误 但是变成b.clone() as B 就会正常
你实例化是二个对象,而父类中没有关于子类的对象相关的内存,无法转
if(b is A && b is B)
return true;
你可以试试看,这返回true。抛砖引玉吧,你可以借此看出自己对面向对象的理解是否基础牢固。
从派生类转化成基类可以
才基类转化成派生类就不行了
{
B c= base.Clone() as B;//为什么这里可以把基类变成派生类?????????
c.b = 100;
return c;
}
而A a = new A();
B b =new B();
b.a = 300;
b.b = 20;
B e = a.Clone() as B;//这里会不行
都是调用clone返回的都是object为什么base.clone就可以转换成派生类
MemberwiseClone();
是一个虚函数,这个函数返回的是当前对象的类型。也就是说:MemberwiseClone()在这里实际返回的是B类型的对象,而不是A类型。
你调用base.Clone()时,实际调用的是 A.Clone(),而A.Clone()调用了MemberwiseClone(); 这一下是不是好理解了?如果改一下,把
A.Clone()
{
A r = new A();
r.a = this.a;
return r;
}
你的B.Clone()肯定会报错。