论文导读:在该模型中共归纳了三大类六种数据传递方式。全面地说明了类与对象间的数据传递问题。构造函数被调用的位置决定了它的初始化作用。构造函数的数据传递方式说明。初始化,C#中数据传递方式的教学模型设计。
关键词:类,对象,初始化,数据传递,C#
0 引言
作者在C#语言的教学过程中深深体会到清楚地解释面向对象的理论是不容易的,但一个好的案例却能很好地说明各种问题。作者为了说明类与对象间的数据传递问题设计了一个数据成员初始化的教学演示模型,在该模型中共归纳了三大类六种数据传递方式,全面地说明了类与对象间的数据传递问题。发表论文,初始化。
三大类是根据类成员[1][2][3](构造函数、方法、字段属性)来划分的:一种是通过构造函数的数据传递方式实现数据成员的初始化;第二种是通过类方法的数据传递方式实现数据成员的初始化;第三种是在对象中直接对public类型的字段或属性赋具体值的数据传递方式。如果没有public类型的字段或属性则只能使用前两种方式。下面将逐一解释。发表论文,初始化。
1构造函数的数据传递方式说明
构造函数被调用的位置决定了它的初始化作用,因此一般使用类的构造函数来初始化类的数据成员。构造函数的初始化分为有参构造函数初始化和无参构造函数的初始化。
1.1使用有参构造函数实现初始化的设计与调用
类构造函数的设计与实现:
定义一个矩形类为例。类中的构造函数设计为有参函数,实现的参考代码如代码1:
//代码1
class RECT
{
public intwidth;
int length;
public RECT(intw, int l)
{
width=w;
length=l;
}
public void print()
{ Console.WriteLine(“The width={0},Thelength={1}”,width,length);}
}
对象调用构造函数的相应设计与实现
参考代码为代码2:
//代码2
class Program
{
static void Main(string[] args)
{
RECTR1=new RECT(10,20);
RECT R2=new RECT(100,200);
Console.WriteLine(“Thewidth of R2={0}”,R2.width);
}
}
输出结果为The width of R2=100。
这里的10和20根据实际程序中的数据来输入。
对象R1执行构造函数RECT(10,20)后,程序将实参10和20分别传给构造函数的形参w和l,对象R1的w值即为10,l值即为20,执行完构造函数后,对象R1的字段width的值就等于10,length的值就等于20。R2的执行过程同R1。图1演示了类与对象间通过有参构造函数进行数据传递的过程。
图1 有参构造函数初始化对象的数据成员参数传递图
1.2使用无参构造函数实现初始化的设计与调用
类构造函数的设计与实现:
构造函数也可以设计为无参的构造函数,也同样可以实现数据成员的初始化功能。实现代码参考代码3。
//代码3
public RECT()
{
width=Convert.ToInt32(Console.ReadLine());
length=Convert.ToInt32(Console.ReadLine());
}
当构造函数为无参构造函数时,相对应的对象调用格式也需要改变。发表论文,初始化。
对象调用构造函数的相应设计与实现:
在Main()主函数中定义对象RECT R2=new RECT();即可。构造函数的两个赋值语句就可以分别从键盘读入两个值给对象R2的width和length字段。
2类方法的数据传递方式说明
构造函数是一类特殊的方法,当有派生类后,特别是对于既有有参构造函数而且还有派生类的情况对于初学者会感觉比较复杂,因此如果不是特别要求采用构造函数初始化,我们也可以在类中不定义构造函数,而是通过普通的方法来实现初始化的功能。方法如同构造函数。
2.1使用有参方法实现初始化的设计与调用
方法的设计与实现:
方法设计为有参方法。参考代码如代码4:
//代码4
class RECT
{
public intwidth;
int length;
public int Length//属性
{ get{returnlength;}
set{length=value;}
}
public voidInit(int w, int l)
{ width=w; length=l;}
public void print()
{Console.WriteLine(“The width={0},The length={1}”,width,length);}
}
对象的调用格式设计与实现:
在Main()主函数中定义完对象后就要调用方法Init实现数据的初始化,参考代码为:
//代码5
staticvoid Main(string[] args)
{
intx,y;
x=Convert.ToInt32(Console.ReadLine());
y=Convert.ToInt32(Console.ReadLine());
RECT R3=new RECT();
R3.Init(x,y);
R3.print();
}
RECT类中没有定义构造函数,但定义对象时仍然要执行一次构造函数,这时执行的是编译器创建的默认构造函数,即一个空的构造函数。紧接着就执行方法Init(x,y),对数据成员实现初始化。发表论文,初始化。数据传递方式同有参构造函数。发表论文,初始化。
2.2使用无参方法实现初始化的设计与调用
方法的设计与实现:
将代码4中的Init(intw, int l)方法改为无参来实现初始化,同1.2,参考代码6:
//代码6
public voidInit()
{
width=Convert.ToInt32(Console.ReadLine());
length= Convert.ToInt32(Console.ReadLine());
}
对象的调用格式设计与实现:
相应地,在Main()主函数中定义完对象后就要调用该初始化方法实现数据的初始化,参考代码7:
//代码7
static void Main(string[] args)
{
RECTR4=new RECT();
R4.Init();
R4.print();}
1中构造函数的所有功能都可以通过2中Init方法实现。
3字段或属性的数据传递方式说明
上面列举了两种可以统称为方法的初始化方式,对象还可以直接初始化数据成员。如当类中有public类型的字段或属性时,对象就可以通过调用该字段或属性赋值进行初始化。
使用字段实现初始化:
类的定义中,字段需要定义为public访问权限,如width字段。
相对应,对象的调用设计为:
static void Main(string[] args)
{ RECT R5=new RECT();
R5.width=10;
R5.print();}
使用属性实现初始化:
类的定义中,属性需要定义为public访问权限,如代码4的Length属性。
相对应,对象的调用设计为:
static void Main(string[] args)
{ RECT R6=new RECT();
R6.Length=20;
R6.print();
}
以上分别从类定义与对象调用两个角度分析,共列举了三大类六种数据传递的方式进行初始化。可见数据传递方式很灵活,关键是保证定义与调用的相互匹配。每位程序设计人员可以根据程序设计的需要或者是自己的喜好来进行选择。
4结语
对类与对象间数据传递的所有方法进行有效的梳理和总结是一项很有教学意义的工作。它的意义不仅仅在于解决了数据如何传递的问题,也全面演示了如何灵活地使用类的所有成员,演示了类定义与对象调用如何匹配,也具体解决了数据初始化的问题。发表论文,初始化。掌握了本文的方法可以为后续的继承与派生的学习打下扎实的基础。
参考文献:
[1]GNIIT.GUI Applications Development Using.NET Framework Student Guide[M].NIIT Education Services(China),2008.
[2]GNIIT. Microsoft Visual C#.Net 2005[M].NIIT Education Services(China),2008.
[3]http://www.functionx.com/vcsharp
|