积极答复者
类的封装

问题
-
我是新手,请教有人能告诉我为什么这个段代码执行后结果等于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 忘记提问
答案
-
你好!
你这是对类概念理解有所偏差,看你的样子是和方法理解相同了,其实这是不对的,下面是我改的代码,希望对你有用:
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)- 已编辑 GaryJu 2011年11月5日 14:43
- 已标记为答案 Dummy yoyoModerator 2011年11月14日 12:29
-
你好楼主:)
原因很简单——因为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;或者
下载MSDN桌面工具(Vista,Win7)
我的博客园
慈善点击,点击此处- 已标记为答案 Dummy yoyoModerator 2011年11月14日 12:29
全部回复
-
你好!
你这是对类概念理解有所偏差,看你的样子是和方法理解相同了,其实这是不对的,下面是我改的代码,希望对你有用:
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)- 已编辑 GaryJu 2011年11月5日 14:43
- 已标记为答案 Dummy yoyoModerator 2011年11月14日 12:29
-
你好楼主:)
原因很简单——因为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;或者
下载MSDN桌面工具(Vista,Win7)
我的博客园
慈善点击,点击此处- 已标记为答案 Dummy yoyoModerator 2011年11月14日 12:29
-
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.
- 已编辑 Dummy yoyoModerator 2011年11月7日 9:05