none
类的封装 RRS feed

  • 问题

  • 我是新手,请教有人能告诉我为什么这个段代码执行后结果等于0吗?

    谢谢了。

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication12
    {
        /// <summary>
        /// 自定义类,封装加数和被加数属性
        /// </summary>
        class MyClass1
        {
            private int x = 0;
            private int y = 0;
            ///<summary>
            ///加数
            ///</summary>
            public int X
            {
                set { x = value; }
                get { return x; }
            }
            ///<summary>
            ///被加数
            ///</summary>
            public int Y
            {
                set { y = value; }
                get { return y; }
            }
        }
        /// <summary>
        /// 自定义类,封装求和方法
        /// </summary>
        class MyClass2
        {
            MyClass1 myclass1 = new MyClass1();     //实例化MyClass1的对象
            /// <summary>
            /// 求和
            /// </summary>
            /// <returns>加法运算和</returns>
            public int Add()
            {
                return myclass1.X + myclass1.Y;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                MyClass1 myclass1 = new MyClass1(); //实例化MyClass1的对象
                MyClass2 myclass2 = new MyClass2(); //实例化MyClass2的对象
                myclass1.X = 3;                     //为MyClass1类中属性赋值
                myclass1.Y = 5;                     //为MyClass2类中属性赋值
                Console.WriteLine(myclass2.Add());  //调用MyClass2类中的Add方法求和
            }
        }
    }


    • 已编辑 太极貔貅 2011年11月5日 13:51 忘记提问
    2011年11月5日 13:50

答案

  • 你好!

    你这是对类概念理解有所偏差,看你的样子是和方法理解相同了,其实这是不对的,下面是我改的代码,希望对你有用:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ClassLibrary4
    {
       
                    class MyClass1
            {
                private int x = 0;
                private int y = 0;
                         public int X
                {
                    set { x = value; }
                    get { return x; }
                }
                            public int Y
                {
                    set { y = value; }
                    get { return y; }
                }
            }
                class MyClass2
            {
                public MyClass1 myclass1 = new MyClass1();     //--------实例化MyClass1的对象
                           public int Add()
                {
                    return myclass1.X + myclass1.Y;
                }
            }
           class Program
           {
                static void Main(string[] args)
                {
                    MyClass1 myclass1 = new MyClass1(); //-----这里是对myclass1的实例化,虽然你在class2里有嵌套class1但是这里和那里是没有关系的,是隔离的----实例化MyClass1的对象
                    MyClass2 myclass2 = new MyClass2(); //----在实例化myclass2的过程中它实例化的class1是在对应的class2对象中----实例化MyClass2的对象
    
                    myclass2.myclass1.X = 3;;                     //---------为MyClass2类的实例化的对象:myclass2中的一个实例化对象myclass1的一个属性。如果按照原来的写法这里的属性赋值和class2对象里的class1无关,当然也就是0
                    myclass2.myclass1.Y = 5;                     //----------同上
                    Console.WriteLine(myclass2.Add());              }
           }
    
        }
    }
    
    
    
    

     


    "I will love the light for it shows me the way, yet I will endure the darkness for it shows me the stars."-- Og Mandino (1923 - 1996)
    2011年11月5日 14:41
  • 你好楼主:)

    原因很简单——因为myclass1和myclass2是两个完全不同的对象。你输出的是myclass2.但是myclass2里边包含了myclass1的一个新实例化,你并没有给这里边的X和Y赋值。自然得出的是0.

    【解决方案】

    class MyClass2
    {
    MyClass1 myclass1 = new MyClass1(); //实例化MyClass1的对象
    /// <summary>
    /// 求和
    /// </summary>
    /// <returns>加法运算和</returns>
    public int Add(int x,int y)
    {
       myclass1.X=x;
       myclass1.Y=y;
       return myclass1.X + myclass1.Y;
    }
    }

    调用:

    MyClass2 myclass2 = new MyClass2(); //实例化MyClass2的对象
     Console.WriteLine(myclass2.Add(1,2));


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月6日 3:20
    版主

全部回复

  • 你好!

    你这是对类概念理解有所偏差,看你的样子是和方法理解相同了,其实这是不对的,下面是我改的代码,希望对你有用:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ConsoleApplication1
    {
        using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace ClassLibrary4
    {
       
                    class MyClass1
            {
                private int x = 0;
                private int y = 0;
                         public int X
                {
                    set { x = value; }
                    get { return x; }
                }
                            public int Y
                {
                    set { y = value; }
                    get { return y; }
                }
            }
                class MyClass2
            {
                public MyClass1 myclass1 = new MyClass1();     //--------实例化MyClass1的对象
                           public int Add()
                {
                    return myclass1.X + myclass1.Y;
                }
            }
           class Program
           {
                static void Main(string[] args)
                {
                    MyClass1 myclass1 = new MyClass1(); //-----这里是对myclass1的实例化,虽然你在class2里有嵌套class1但是这里和那里是没有关系的,是隔离的----实例化MyClass1的对象
                    MyClass2 myclass2 = new MyClass2(); //----在实例化myclass2的过程中它实例化的class1是在对应的class2对象中----实例化MyClass2的对象
    
                    myclass2.myclass1.X = 3;;                     //---------为MyClass2类的实例化的对象:myclass2中的一个实例化对象myclass1的一个属性。如果按照原来的写法这里的属性赋值和class2对象里的class1无关,当然也就是0
                    myclass2.myclass1.Y = 5;                     //----------同上
                    Console.WriteLine(myclass2.Add());              }
           }
    
        }
    }
    
    
    
    

     


    "I will love the light for it shows me the way, yet I will endure the darkness for it shows me the stars."-- Og Mandino (1923 - 1996)
    2011年11月5日 14:41
  • 你好楼主:)

    原因很简单——因为myclass1和myclass2是两个完全不同的对象。你输出的是myclass2.但是myclass2里边包含了myclass1的一个新实例化,你并没有给这里边的X和Y赋值。自然得出的是0.

    【解决方案】

    class MyClass2
    {
    MyClass1 myclass1 = new MyClass1(); //实例化MyClass1的对象
    /// <summary>
    /// 求和
    /// </summary>
    /// <returns>加法运算和</returns>
    public int Add(int x,int y)
    {
       myclass1.X=x;
       myclass1.Y=y;
       return myclass1.X + myclass1.Y;
    }
    }

    调用:

    MyClass2 myclass2 = new MyClass2(); //实例化MyClass2的对象
     Console.WriteLine(myclass2.Add(1,2));


    如果你有其它意见或私下交流,请直接发送maledong_work@foxmail.com;或者讨论(Talk)
    下载MSDN桌面工具(Vista,Win7)
    我的博客园
    慈善点击,点击此处
    2011年11月6日 3:20
    版主
  • Hi 太极貔貅,

    欢迎来到MSDN论坛!

    您的问题处理的怎么样了?

    您可以对您自己的代码、以及GaryJu和Wei_Dong的代码,分别单步调试。这样子可以帮助您更好地理解该问题。

    同时,也可以考虑,在调试时,对Main()方法中的变量进行监控。

    请您参考:

    如何:在调试器中监视表达式

    http://msdn.microsoft.com/zh-cn/library/0taedcee.aspx

    如果您还有任何问题,不妨告诉我们!

    祝您,一切顺利!


    Yoyo Jiang[MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2011年11月7日 9:04
    版主