上节课我把属性形容成是一个进入房间的窗户或通道,关闭着的房间就是封装好的类,那么属性用代码要如何解释呢?其实这个问题,在我刚学习属性时也是很不理解,如果需要对字段的值进行判断,就写我上面的两段代码(17-38行)不就可以了吗?但是随着我们学习的不断深入,属性是必须掌握的一个知识点,现在同学们只需要会定义属性,同时会访问属性就可以了,日后深入学习(如windowsform)时,我们就理解属性的用法和好处了。在我们这个例子中属性机制就要做到如同守门员一样,限制住非海、陆、空的三种军种,下面把按照刚才军种的例子我来单独写一段代码,同时使用属性,在看代码前,我们先来看一下如何定义一个属性,它的基本语法是:
2 {
3 //先定义一个私有变量实际年龄age
4 int age = 10;
5
6 //再定义一个属性,
7 public int Age
8 {
9 //输出时的年龄比实际年龄age大三岁,即输出的是10+3岁
10 get { return age + 3; }
11 //给年龄赋值时,先判断年龄的范围
12 set
13 {
14 //如果年龄小于1岁或是大于120岁时,不允许赋值,提示错误。
15 if (value < 1 || value > 120)
16 Console.WriteLine("您输入的年龄有误");
17 //如果年龄符合范围,允许赋值,赋完值后的age即是value你赋的值。
18 else
19 age = value;
20
21 }
22 }
{
get { return a; }
set { a = value; }
}
{
get { return a; }
set { a = value; }
}
2 {
3 //先定义一个私有变量实际年龄age
4 int age = 10;
5
6 //再定义一个属性,
7 public int Age
8 {
9 //输出时的年龄比实际年龄age大三岁,即输出的是10+3岁
10 get { return age + 3; }
11 //给年龄赋值时,先判断年龄的范围
12 set
13 {
14 //如果年龄小于1岁或是大于120岁时,不允许赋值,提示错误。
15 if (value < 1 || value > 120)
16 Console.WriteLine("您输入的年龄有误");
17 //如果年龄符合范围,允许赋值,赋完值后的age即是value你赋的值。
18 else
19 age = value;
20
21 }
22 }
23 //定义一个得到真实年龄的方法
24 public void realage()
25 {
26 Console.WriteLine("真实年龄为" + age + "岁");
27 }
28 }
29 class Program
30 {
31
32 static void Main(string[] args)
33 {
34 //实例化一个人Ren类aboy孩子对象
35 Ren aboy = new Ren();
36
37 //此时打印出的是,未通过属性直接用到的age初值,也就是真实年龄。
38 aboy.realage();
39 Console.WriteLine();
40
41 //现在我们直接取得孩子的年龄,因为age是私有变量,我们必须通过属性Age得到,值为虚假的大三岁的年龄
42 Console.WriteLine("通过属性得到的年龄为:"+aboy .Age);
43 Console.WriteLine();
44
45 //现在我们给孩子的年龄赋一个0岁的值,因为age是私有变量,同样赋值也是通过属性Age,
46 //此时由于年龄范围的限制,是会报错的。
47 aboy.Age = 0;
48
49 //我们再给孩子的年龄赋一个12岁,因为age是私有变量,同样赋值也是通过属性Age
50 aboy.Age = 12;
51 Console.WriteLine();
52
53 //此时因为年龄的范围合法,原来的age=10,便被替换成了12。
54 //我们再来打印孩子的真实年龄
55 aboy.realage();
56 Console.WriteLine();
57 //我们再来打印一下age改为12后的虚假年龄Age
58 Console.WriteLine("通过属性得到的年龄为:" + aboy.Age);
59 Console.WriteLine();
60
61 }
62 }
2 {
3 //public string Armytype = "";
4 //public void ArmyFunction()
5 //{
6 // switch (Armytype)
7 // {
8 // case "陆军":
9 // Console.WriteLine("现代陆军都是大规模的机械化部队,拥有大量的重装备和后勤补给。");
10 // break;
11 // case "海军":
12 // Console.WriteLine("杜鲁门曾说过:海军到哪里,国家的权利就到哪里 .");
13 // break;
14 // case "空军":
15 // Console.WriteLine("战略空军将使战争形态向可控战争转变。");
16 // break;
17 // default:
18 // Console.WriteLine("{0}不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军", Armytype);
19 // break;
20 // }
21 //}
22 //下面的代码实现了和上面一下的功能,先定义一个私有的字段Armytype,再定义一个属性
23 string Armytype = "";
24 public string Armytype1
25 {
26 get {
27 return Armytype;
28
29 }
30 set
31 {
32 switch (value)
33 {
34 case "陆军":
35 Console.WriteLine("现代陆军都是大规模的机械化部队,拥有大量的重装备和后勤补给。");
36 Armytype = value;
37 break;
38 case "海军":
39 Console.WriteLine("杜鲁门曾说过:海军到哪里,国家的权利就到哪里 .");
40 Armytype = value;
41 break;
42 case "空军":
43 Console.WriteLine("战略空军将使战争形态向可控战争转变。");
44 Armytype = value;
45 break;
46 default:
47 Console.WriteLine("{0}不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军", Armytype);
48 break;
49 }
50 }
51 }
52
53 }
54 class Program
55 {
56
57 static void Main(string[] args)
58 {
59 //我们来创建一个军人类Armyman 的实例对象ASoldiers(士兵)
60 Armyman ASoldiers = new Armyman();
61
62 //当赋值除海军、陆军、空军时,出现错误提示
63 ASoldiers.Armytype1 = "男性";
64 //因为有属性赋值时的判断,所以此时属性Armytype1还是原来Armytype字段的初值:空
65 Console.WriteLine("赋值后的军种为:" + ASoldiers.Armytype1);
66 Console.WriteLine();
67
68 //当正常赋值时,得到正确的结果。
69 ASoldiers.Armytype1 = "空军";
70 Console.WriteLine();
71 //因为有属性赋值时的判断,所以此时属性Armytype1是已经赋的“空军”
72 Console.WriteLine("赋值后的军种为:" + ASoldiers.Armytype1);
73
74 //ASoldiers.Armytype = "男性";
75 //ASoldiers.ArmyFunction();
76 //Console.WriteLine(ASoldiers.Armytype);
77
78 }
79 }
80 }
2 {
3 public string Armytype = "";
4 public void ArmyFunction()
5 {
6 switch (Armytype)
7 {
8 case "陆军":
9 Console.WriteLine("现代陆军都是大规模的机械化部队,拥有大量的重装备和后勤补给。");
10 break;
11 case "海军":
12 Console.WriteLine("杜鲁门曾说过:海军到哪里,国家的权利就到哪里 .");
13 break;
14 case "空军":
15 Console.WriteLine("战略空军将使战争形态向可控战争转变。");
16 break;
17 default:
18 Console.WriteLine("{0}不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军", Armytype);
19 break;
20 }
21 }
22 //下面的代码实现了和上面一下的功能,先定义一个私有的字段Armytype,再定义一个属性
23 //string Armytype = "";
24 // public string Armytype1
25 //{
26 // get {
27 // return Armytype;
28
29 // }
30 // set
31 // {
32 // switch (value)
33 // {
34 // case "陆军":
35 // Console.WriteLine("现代陆军都是大规模的机械化部队,拥有大量的重装备和后勤补给。");
36 // Armytype = value;
37 // break;
38 // case "海军":
39 // Console.WriteLine("杜鲁门曾说过:海军到哪里,国家的权利就到哪里 .");
40 // Armytype = value;
41 // break;
42 // case "空军":
43 // Console.WriteLine("战略空军将使战争形态向可控战争转变。");
44 // Armytype = value;
45 // break;
46 // default:
47 // Console.WriteLine("{0}不是兵种,请输入现代战争中的三大兵种!海军、陆军、空军", Armytype);
48 // break;
49 // }
50 // }
51 //}
52
53 }
54 class Program
55 {
56
57 static void Main(string[] args)
58 {
59 //我们来创建一个军人类Armyman 的实例对象ASoldiers(士兵)
60 Armyman ASoldiers = new Armyman();
61
62 /**/////当赋值除海军、陆军、空军时,出现错误提示
63 //ASoldiers.Armytype1 = "男性";
64 /**/////因为有属性赋值时的判断,所以此时属性Armytype1还是原来Armytype字段的初值:空
65 //Console.WriteLine("赋值后的军种为:" + ASoldiers.Armytype1);
66 //Console.WriteLine();
67
68 /**/////当正常赋值时,得到正确的结果。
69 //ASoldiers.Armytype1 = "空军";
70 //Console.WriteLine();
71 /**/////因为有属性赋值时的判断,所以此时属性Armytype1是已经赋的“空军”
72 //Console.WriteLine("赋值后的军种为:" + ASoldiers.Armytype1);
73
74
75 //给字段Armytype赋值为“男性”
76 ASoldiers.Armytype = "男性";
77 //可以通过这个方法告知男性不符合赋值规则,输出提示
78 ASoldiers.ArmyFunction();
79 //但此时,“男性”这个值已经赋给了Armytype字段,这是错误的做法。
80 Console.WriteLine(ASoldiers.Armytype);
81
82 }
83 }
84 }