我是刚接触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(查询)放在一个新的窗体里,但是放到新窗体里还要重新声明新的对象,那么它的属性值又变空了,不知道怎么才能实现两个对象相等呢。
我表达的不清楚,不知道诸位能看懂不能?昨晚为这问题弄到今天早上,大家有什么办法吗?

解决方案 »

  1.   

    桌面程序还是web程序,把代码贴出来
      

  2.   

    哇,看你的描述,比解决问题更累人;
    若我没理解错的话,你碰到的问题应该是如何在2个类之间传递数据,以达到2个类都能够访问这个数据的目的!要达到这个目的,有很多方法,比如说:
    1、把Student的信息,保存在数据库/文件等 存储介质上,Form1上的Button1和Form2上的Button2都可以通过数据库或文件操作去获取数据;
    2、在程序中,声明一个共享内存区域,把Student对象保存在哪里,这样2个Button也都能够访问共同的数据;
    3、.....
      

  3.   

    你这个类设计是非常糟糕, add/chakan不应该是Student的行为。并且你的问题,也不应该是一个问题。你不要通过对象来传递数据,应该通过数据库来交流数据。在另外一个窗体,再生成一个Student对象,这个对象的数据,来自于数据库。
      

  4.   

    我来分析分析……//我定义了一个student类(和窗体不在一个命名空间),
    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();
      

  5.   


    小弟由于是初学者刚学习编程不到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;        }
        },
      

  6.   

    我实在看不下去了,我得纠正你的拼写:
    button!=botton;
    operate!=opearte;
    然后我再慢慢看。
      

  7.   

    static在这里的作用可以这样理解:
    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时,直接写赋值语句就是了。
      

  8.   

    LS说LZ的OOD有问题
    虽然我也觉得不合理但是很想听听LS的有什么更好的设计方式
    我也是新手
    学习
      

  9.   

    student类现在是一个只有数据的类,而operate(opearte)类则是一个只有方法的控制类,这都是OOD中应该尽量避免的东西。LZ的student类现在还很简单,但是当功能丰富之后,他很有可能把所有操作全部写到operate类里面去,到头来就是一个假的OO。"chakan"方法就是一个例子,如果必须有这样一个方法,那么这个方法应该属于student类而非operate。我说的OOD有问题在这里。
      

  10.   

    这里把student封装成一个struct,然后作为operate的一个成员会不会好一点呢?
      

  11.   

    我也是刚接触面向对象!所以先弄个例子试验锻炼下。我开始想的是add/chakan应该是student的,但是刚才有位仁兄说add/chakan不应该是Student的行为,然后我在想student确实不应该有这样的行为,楼上的大哥,我现在犯迷了,就这么简单的分析我都弄不懂! 还有关于static,我知道静态方法是属于类所有的,对象不能够调用。就像我刚才的例子为什么不加就实现不了呢?
      

  12.   

    e....
    不加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新手,有点乱 = =
    跟着讨论,学习学习
      

  13.   

    理想的类应该封装数据和对这些数据的操作。
    推荐一本叫《OOD启思录》的书,没记错应该是人民邮电出版社的。