c# 关于继承多态的问题

zdkiller 2009-05-04 10:29:09
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace My2
{
class Program
{
static void Main(string[] args)
{

struct Point :Ichanagep {
public int x, y;
public void Change(int x, int y)
{
this.x = x;
this.y = y;
}
public override string ToString()
{
return string.Format("({0},{1})",x,y );
}
}
interface Ichanagep {
void Change(int x,int y);
}
}
...全文
149 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
bwangel 2009-05-04
  • 打赏
  • 举报
回复
唉,我也搞不清楚,这代码太深奥了.如果大家的程序都是这么玩的话,我就惨了.
E_wait 2009-05-04
  • 打赏
  • 举报
回复
我个人的理解是这样的,首先point是struct是个值类型,在这里它放在栈上,而Ichanagep是interface是引用类型在这里它放在堆上;另外object同样是引用类型。
这样p为值类型,o为引用类型
将p强制转换是重新分配内存给这个转化后的新对象,对p并没影响,所以(Ichanagep)p对p没有影响
将o强制转换为Point这时(Point)o同样是与o不是同一个对象。对o没有影响
将o强制转换为Ichanagep时因为Ichanagep同样是引用类型,所以(Ichanagep)o与o是指向同一堆中的对象。
你可以运行下面的代码看看
Point p = new Point();
p.x = p.y = 1;
Console.WriteLine(p);
p.Change(2, 2);
Console.WriteLine(p);
object o = p;
Console.WriteLine(ReferenceEquals(o, p));//判断两个引用是否指向同一个实例
Console.WriteLine(o);
((Point)o).Change(3, 3);
Console.WriteLine(ReferenceEquals((Point)o, o));
Console.WriteLine(p.x);
Console.WriteLine(o);
((Ichanagep)p).Change(4, 4);
Console.WriteLine(ReferenceEquals((Ichanagep)p, p));
Console.WriteLine(p);
((Ichanagep)o).Change(5, 5);
Console.WriteLine(o);
Console.WriteLine(ReferenceEquals((Ichanagep)o, o));
Console.ReadKey();
anheizhizi 2009-05-04
  • 打赏
  • 举报
回复
最后一句能改变是因为 接口 和 O 都是引用类型
AutoReply 2009-05-04
  • 打赏
  • 举报
回复
ding
vwxyzh 2009-05-04
  • 打赏
  • 举报
回复
Point p = new Point();
p.x = p.y = 1;
Console.WriteLine(p );
p.Change(2,2);//这个就不说了
Console.WriteLine(p);
object o = p;//boxing
Console.WriteLine(o );
((Point)o).Change(3,3);//把o拆箱之后再change,所以,和p、o都没关系
Console.WriteLine(p.x );
Console.WriteLine(o );
((Ichanagep)p).Change(4,4);//把p装箱之后再change,所以,和p、o都没关系
Console.WriteLine(p );
((Ichanagep)o).Change(5,5);//把o强转之后再change,所以改变了o
Console.WriteLine(o);

zgke 2009-05-04
  • 打赏
  • 举报
回复
装箱和拆箱... struct 是值类型 在操作中P和O的值不会变化

只有这个改变了O的值((Ichanagep)o).Change(5,5);

zdkiller 2009-05-04
  • 打赏
  • 举报
回复
结果不明白,您能给解释一下吗
zdkiller 2009-05-04
  • 打赏
  • 举报
回复
有谁给解释一下输出结果,我有点不明白,尤其是后面的三个
zdkiller 2009-05-04
  • 打赏
  • 举报
回复
最后一个的结果为什么是那样
anheizhizi 2009-05-04
  • 打赏
  • 举报
回复
这结果有什么不对的么? LZ 想问什么?
zdkiller 2009-05-04
  • 打赏
  • 举报
回复
(1,1)
(2,2)
(2,2)
2
(2,2)
(2,2)
(5,5)
这是结果
zdkiller 2009-05-04
  • 打赏
  • 举报
回复
用struct没有问题,我就是想知道为什么是那种结果
我不懂电脑 2009-05-04
  • 打赏
  • 举报
回复
不要用struct用class
zdkiller 2009-05-04
  • 打赏
  • 举报
回复
是下面这个
不明白为什么会是那种输出结果
急急急!!!
zdkiller 2009-05-04
  • 打赏
  • 举报
回复
namespace My2
{
class Program
{
static void Main(string[] args)
{
//Cat a = new Cat();
//a.eat();
//a.sleep();
//An n;
//n = a;
//n.sleep();
Point p = new Point();
p.x = p.y = 1;
Console.WriteLine(p );
p.Change(2,2);
Console.WriteLine(p);
object o = p;
Console.WriteLine(o );
((Point)o).Change(3,3);
Console.WriteLine(p.x );
Console.WriteLine(o );
((Ichanagep)p).Change(4,4);
Console.WriteLine(p );
((Ichanagep)o).Change(5,5);
Console.WriteLine(o);
Console.ReadKey();
}
}
//abstract class An {
// virtual public void sleep() { Console.WriteLine("animal is sleeping"); }
// // abstract public void eat();

//}
//class Cat : An ,Imp {
// public override void sleep()
// {
// Console.WriteLine("cat is sleeping");
// }
// public void eat() {
// Console.WriteLine("cat eat") ;
// }
//}
//interface Imp {
// void eat();
//}
struct Point :Ichanagep {
public int x, y;
public void Change(int x, int y)
{
this.x = x;
this.y = y;
}
public override string ToString()
{
return string.Format("({0},{1})",x,y );
}
}
interface Ichanagep {
void Change(int x,int y);
}
}
jryu2k5 2009-05-04
  • 打赏
  • 举报
回复
类的对象在内存中具有唯一性,所以当使用Change改变数值的时候p的值就会出现变更
而变量o它没有实体,只是对p的引用,也就是说o其实就是p,
而最后一个是因为Point类承继于接口Ichanagep,接口并不是一个方法,只是一个方法的申明的规范,它调用的实际就是Point类的Change方法,C#有一个很有用的东西就是接口出现的地方,任何承继于该接口的类都可以出现
缥缈大木头 2009-05-04
  • 打赏
  • 举报
回复
堆和栈,装箱和拆箱,这个一定要弄清楚啊

yulongcs 2009-05-04
  • 打赏
  • 举报
回复

110,571

社区成员

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

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

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