我是刚接触c #的新手!我最近在做一个例子就是模拟面对对象, 我定义了一个student类(和窗体不在一个命名空间),有name、age属性,我实现的是添加信息后然后能查看。 我首先在button1(添加)事件里实例化对象然后调用student1的add方法(传递textbox的值,给属性赋值)
然后在botton2(查看)事件里实例化对象调用student2的chakan方法(返回name、age属性的值)赋给一个textbox。
问题出现了:当单击botton1后,student1的age、name属性被赋值,一切都很正常,但是单击botton2后,textbox是空,后来我反复跟踪代码,感觉应该是对象的问题,就是每次单击后都会创建一个新的对象,那么它的属性值也不一样。也就是说当botton1,student1的age、name属性被赋值后,在点botton2创建student2对象它的属性值值又会变空。我的理解对吗?然后我又想了个笨方法,怎样让两个对象变成一个对象。也就是在窗体的类下面直接创建对象student student1=new student().
在botton1里直接调用student1的add方法然后把student1对象传递过去。在add方法里接收student1对象直接对student1属性赋值。
在botton2调用student1的chakan方法传递student1对象,最后结果终于一样了。但是新的问题又出现了,我想把botton2(查询)放在一个新的窗体里,但是放到新窗体里还要重新声明新的对象,那么它的属性值又变空了,不知道怎么才能实现两个对象相等呢。
我表达的不清楚,不知道诸位能看懂不能?昨晚为这问题弄到今天早上,大家有什么办法吗?
然后在botton2(查看)事件里实例化对象调用student2的chakan方法(返回name、age属性的值)赋给一个textbox。
问题出现了:当单击botton1后,student1的age、name属性被赋值,一切都很正常,但是单击botton2后,textbox是空,后来我反复跟踪代码,感觉应该是对象的问题,就是每次单击后都会创建一个新的对象,那么它的属性值也不一样。也就是说当botton1,student1的age、name属性被赋值后,在点botton2创建student2对象它的属性值值又会变空。我的理解对吗?然后我又想了个笨方法,怎样让两个对象变成一个对象。也就是在窗体的类下面直接创建对象student student1=new student().
在botton1里直接调用student1的add方法然后把student1对象传递过去。在add方法里接收student1对象直接对student1属性赋值。
在botton2调用student1的chakan方法传递student1对象,最后结果终于一样了。但是新的问题又出现了,我想把botton2(查询)放在一个新的窗体里,但是放到新窗体里还要重新声明新的对象,那么它的属性值又变空了,不知道怎么才能实现两个对象相等呢。
我表达的不清楚,不知道诸位能看懂不能?昨晚为这问题弄到今天早上,大家有什么办法吗?
解决方案 »
- 求助:控件焦点的问题
- 求一条SQL语句。
- 如何在VS2005下开发.NET3.0程序
- 紧急! 考试题--->画图:给你三个点,请画一个基于这三个点的圆.
- 为什么绑定失效。
- 若要运行此应用程序,您必须首先安装.NET Framework的以下版本之一: V2.0.50727
- 请教关于microsoft enterprise library caching block的问题
- 将form的FormBorderStyle属性设置为None后怎样实现窗口的拖放?
- 请问各位有没有用mouse任意画mouse轨迹的例子?
- .net 排序问题
- 快疯了,HTML无法显示CSS样式
- 彻底崩溃,请高手来看看吧...
若我没理解错的话,你碰到的问题应该是如何在2个类之间传递数据,以达到2个类都能够访问这个数据的目的!要达到这个目的,有很多方法,比如说:
1、把Student的信息,保存在数据库/文件等 存储介质上,Form1上的Button1和Form2上的Button2都可以通过数据库或文件操作去获取数据;
2、在程序中,声明一个共享内存区域,把Student对象保存在哪里,这样2个Button也都能够访问共同的数据;
3、.....
class student;
//有name、age属性,我实现的是添加信息后然后能查看。
string name;
int age;
void add();
//我首先在button1(添加)事件里实例化对象然后调用student1的add方法(传递textbox的值,给属性赋值)
new student1().add(...);//然后在botton2(查看)事件里实例化对象调用student2的chakan方法(返回name、age属性的值)赋给一个textbox。
textbox.text=new student2().chakan();
//问题出现了:当单击botton1后,student1的age、name属性被赋值,一切都很正常,但是单击botton2后,textbox是空,后来我反复跟踪代码,感觉应该是对象的问题,就是每次单击后都会创建一个新的对象,那么它的属性值也不一样。也就是说当botton1,student1的 age、name属性被赋值后,在点botton2创建student2对象它的属性值值又会变空。我的理解对吗?
你的感觉是对的。对于一个类的两个不同实例,它们并不共享数据,也就是说它们只能是同类,而不是同一个东西,就像你是人我也是人,我们都属于人这个类,都是人这个类的实例,但是我.dna!=你.dna。
//然后我又想了个笨方法,怎样让两个对象变成一个对象。也就是在窗体的类下面直接创建对象student student1=new student().
在botton1里直接调用student1的add方法然后把student1对象传递过去。在add方法里接收student1对象直接对student1属性赋值。
在botton2调用student1的chakan方法传递student1对象,最后结果终于一样了。//但是新的问题又出现了,我想把botton2(查询)放在一个新的窗体里,但是放到新窗体里还要重新声明新的对象,那么它的属性值又变空了,不知道怎么才能实现两个对象相等呢。
//我表达的不清楚,不知道诸位能看懂不能?昨晚为这问题弄到今天早上,大家有什么办法吗?如果你要实现对象在窗体之间传递,最简单的方法是用public函数,比如你要从form1传到form2,可以给form2写函数:
private student student2;
public void sendObj(student s)
{
this.student2=s;
}
这样在form1里启动一个新的form2时就可以调用这个函数传递:
form2 f=new form2();
f.sendObj(this.student1);
f.show();
小弟由于是初学者刚学习编程不到2个星期。所以数据库操作 一些SQL语句我还不会所以想通过代码来实现。
我想了下add/chakan确实不应该是Student的行为。于是我又添加个opearte类。 如果student student1 = new student();放在方法里声明,结果又是2个不同的对象。
我查了下有人说用static能实现共享,我试了下果然达到目的,static不是声明静态的吗? 如果不加static的话2个botton调用方法时都先执行student student1 = new student();又会成2个不同的对象,加的话只执行1次!这是什么原因?小弟表达有点笨,让大家费脑子了,帮我解决下吧!感激不尽。private void button1_Click(object sender, EventArgs e) //这是添加按钮
{
opearte op = new opearte();
op.add(textBox1.Text, textBox2.Text, textBox3.Text, textBox4.Text);
}(两个botton不在一个窗体)private void button1_Click(object sender, EventArgs e)//查看按钮
{
opearte op = new opearte();
textBox1.Text= op.chaxun();
}
class opearte //opearte 类
{
static student student1 = new student();
public void add( string code, string name, string age, string xingbie)
{
student1.Codes = code;
student1.names = name;
student1.ages = age;
student1.xingbies = xingbie;
}
public string chaxun()
{
string text = "";
text += "编号:" + student1.Codes + '\r' + '\n';
text += "姓名:" + student1.names + '\r' + '\n';
text += "年龄:" + student1.ages + '\r' + '\n';
text += "性别:" + student1.xingbies + '\r' + '\n';
return text; }
},
button!=botton;
operate!=opearte;
然后我再慢慢看。
class c{
public static void i_am_a_static_method(){}
public void i_am_not_static(){}
}
然后有
c c1=new c();
c c2=new c();
可以发现只能访问c1.i_am_not_static()和c2.i_am_not_static()。
实际上你应该把类c理解成两个类:
class c{
public void i_am_not_static(){}
}
这是c1和c2所属的类。
然后又有
class c_static{
public void i_am_a_static_method(){}
}
而且在某个特殊的隐秘的地方,有这样的默认的声明:
c_static c=new c_static();
当你访问c.i_am_a_static_method()时,实际上是访问c_static.i_am_a_static_method()。
另外必须指出的是你的OOD依然有问题。add方法可以直接用system.collection.generic.list<>之类的东西实现,而chakan根本不应该成为一个方法,当你要把student的某些值赋给textbox时,直接写赋值语句就是了。
虽然我也觉得不合理但是很想听听LS的有什么更好的设计方式
我也是新手
学习
不加static为什么不能共享你要的数据我觉得sworddx解释的很清楚的
——————————————————————————————————————————
而且在某个特殊的隐秘的地方,有这样的默认的声明:
c_static c=new c_static();
当你访问c.i_am_a_static_method()时,实际上是访问c_static.i_am_a_static_method()。
——————————————————————————————————————————
如果不加static,访问的是两个不同的实例,当然是不可能实现的。如果用C++我的思路到是挺清晰
student封装成一个struct
数据不用数据库的话就放在一个vector里面作为operate的成员
operate类的add和chakan方法都只要把对vector的操作方法封装起来就可以
add和chakan的具体数据通过更外界的数据传递过来但似乎你的例子中数据是一个节点,不是一串,我也是OO新手,有点乱 = =
跟着讨论,学习学习
推荐一本叫《OOD启思录》的书,没记错应该是人民邮电出版社的。