基类转换成派生类的问题

panyijun 2008-09-16 10:21:00
class Program
{
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);
}
}

public class A : ICloneable
{
public A()
{

}

public int a=200;
#region ICloneable 成员

public virtual object Clone()
{
return MemberwiseClone();
}

#endregion
}

public class B:A
{
public int b = 10;

public B():base()
{

}
public override object Clone()
{
B c= base.Clone() as B;//为什么这里可以把基类变成派生类?????????
c.b = 100;
return c;
}
}
...全文
477 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
flon 2008-09-17
  • 打赏
  • 举报
回复
顶下有点意思
panyijun 2008-09-16
  • 打赏
  • 举报
回复
楼上的啊,谢谢了终于明白了什么原因
brallow 2008-09-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 panyijun 的回复:]
我是clone搞不懂,为什么 public override object Clone()
{
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…
[/Quote]
呵呵,给你个答案吧,因为
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()肯定会报错。



panyijun 2008-09-16
  • 打赏
  • 举报
回复
我是clone搞不懂,为什么 public override object Clone()
{
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就可以转换成派生类
LQknife 2008-09-16
  • 打赏
  • 举报
回复
你是被clone搞混了
从派生类转化成基类可以
才基类转化成派生类就不行了
  • 打赏
  • 举报
回复
这很简单。

变量a不论你声明为什么类型,它指向一个A类对象。变量b不论你声明什么类型,它指向一个B类对象。不是说“可以把基类变成派生类”这种把类型类型和对象本身混淆起来,而是对象b既“是”A类对象也“是”B类对象,也就是说
if(b is A && b is B)
return true;
你可以试试看,这返回true。

抛砖引玉吧,你可以借此看出自己对面向对象的理解是否基础牢固。
greystar 2008-09-16
  • 打赏
  • 举报
回复
B c= base.Clone() as B;//为什么这里可以把基类变成派生类?????????
这是因为你实例化的对象本身就是B,B相当包含A存在.所以可以转

B e = a.Clone() as B;//这里会运行错误 但是变成b.clone() as B 就会正常
你实例化是二个对象,而父类中没有关于子类的对象相关的内存,无法转
brallow 2008-09-16
  • 打赏
  • 举报
回复

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; //这种强制转换也是可以成功的。
sxmonsy 2008-09-16
  • 打赏
  • 举报
回复
我来接点分

110,539

社区成员

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

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

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