面向对象基础一
一、类与实例
首先我做一个实验,点击一个“猫叫”的按钮,会弹出小猫的叫声“喵”的提示框!
这个实在很简单
MessageBox.Show("喵");
问题一:如果需要点击另外一个按钮,也让他弹出小猫的叫声“喵”的提示框!
解决方法:增加一条语句:MessageBox.Show("喵");
问题:这样子就会重复了,
解决方法:我们需要些一个函数,其他需要的地方直接调用。
1: string Shout()
2: {
3: return "喵";
4: }
问题:如果别的窗口要用的话,怎么办?
解决:public string Shout()
但是,Shout放在这个窗口中不合适,就好比居委会的电视机,放在你家,当然都可以来看,但是如果放在居委会会更好,所以,我们这里要用到类,如:
1: class Cat
2: {
3: public string Shout()
4: {
5: return "喵";
6: }
7: }
这样子猫叫提示框的代码就是:
1: Cat cat = new Cat();
2: MessageBox.Show(cat.Shout());
简单的讲,这就是类。
2、构造函数
还是上面的小猫,如果我们希望小猫应该有一个姓名,比如叫"咪咪",当咪咪叫的时候,最好是能够提示出名字,是那只猫在叫,这个时候,我们就要考虑构造方法了。
构造方法,又叫构造函数,其实就是对类进初始化。构造方法和类同名,无返回值,也不需要Void,在new的时候调用。
如:Cat cat = new Cat();中,new 后面的Cat()其实就是构造方法。
这种情况是这样子的,所有的类都有构造方法,如果你不编写代码,系统会默认生成空的构造方法,如果你定义了构造方法,那么默认的构造方法就自动失效了。我把上述的类改一下:
1: class Cat
2: {
3: private string Name = "";
4: public Cat(string name)
5: {
6: Name = name;
7: }
8:
9: public string Shout()
10: {
11: return "我的名字叫" + Name + ",喵";
12: }
13: }
那么在点击按钮的时候,代码就会变成:
1: Cat cat = new Cat("咪咪");
2: MessageBox.Show(cat.Shout());
3、方法重载
还是上面的例子,如果事先猫没有姓名,那么怎么办了?这个时候,我们就要用到方法的重载。
方法的重构其实很简单:就是提供了创建同名的多种方法的能力,但是这些方法需要使用不同的参数类型。当然这种重载不单单是构造方法可以,其他普通的方法也可以重载。
1: class Cat
2: {
3: private string Name = "";
4: public Cat(string name)
5: {
6: Name = name;
7: }
8: public Cat()
9: {
10: Name = "无名";
11: }
12: public string Shout()
13: {
14: return "我的名字叫" + Name + ",喵";
15: }
16: }
这样子调用 Cat cat = new Cat("咪咪"); Cat cat = new Cat();
方法重载要注意的是,方法名要相同,但是参数类型或者个数必须有所不同,否则重载就没哟意义了。 如果,我们只要需要分清楚猫的姓和名,还可以重载 public Cat(string firstName,string lastName) 如果要让猫叫的次数改变,他叫几声,要如何做呢? 当然你可以再构造方法里面加一个叫的次数,但是叫几声其实不必在实例化的时候声明,我们可以之后在规定,这个时候,我们需要用到的属性。
4、属性与修饰符
属性是一个方法或者一对方法,但在调用他的代码看来,他是一个字段,即属性适合于一字段的方法使用方法调用的场合。上面的类可以添加:
1: private int shoutNum = 3;
2: public int ShoutNum
3: {
4: get
5: {
6: return shoutNum;
7: }
8: set
9: {
10: shoutNum = value;
11: }
12: }
这里需要说明的是get和set,因为这个东东很多地方要用到,不理解他的意思是肯定不行的。
get表示外界调用时可以得到shoutNum的值;
set表示外界可以给内部的shoutNum赋值;
当然,如果我们把shoutnum改成public也可以,但是这样子就会存在这样子一种现象:
比如你修建了一个房子,你把他设置成为public,那么这个房子就是透明的了,什么东西外部都可以看得到,实际上这个房子大部分是墙,只有少部分是门和窗。所以我只希望门和窗式public的,其余的都是private,对于房子来说,门和窗式可以控制的。这就是讲,只有当门和窗打开的时候,才可以让别人看到。
换一句话说,如果shoutnum是public,那么任何时候都可以改,但是,如果改成属性,那就很好控制了。
当然,我们可以控制叫声的次数:
1: public int ShoutNum
2: {
3: get
4: {
5: return shoutNum;
6: }
7: set
8: {
9: if (value <= 10)
10: shoutNum = value;
11: else
12: shoutNum = 10;
13: }
14: }
这个时候,Shout()的方法也要改了
1: public string Shout()
2: {
3: string result = "";
4: for (int i = 0; i <= shoutNum; i++)
5: {
6: result += "喵 ";
7: }
8: return "我的名字叫" + Name + "," +result;
9: }
调用的时候可以这样子写 Cat cat = new Cat("咪咪"); cat.ShoutNum =8; MessageBox.Show(cat.Shout()); 这个时候猫叫9声 如果不要cat.ShoutNum = 8;那么猫叫4声;