直播中
閑話少說(shuō),讓我們進(jìn)入正題.這次我要向大家講的是C#中的屬性.屬性是什么呢,比如說(shuō)我是男的,男就是我的一人屬性.我是一個(gè)大一的學(xué)生,大一也是我的一個(gè)屬性.屬性就是一個(gè)對(duì)象的性質(zhì).很簡(jiǎn)單吧,呵呵!下面,我給出兩個(gè)例子,第一個(gè)例子出明了如何聲明一個(gè)可以修改的屬性,另一個(gè)例了建立了一個(gè)抽象的屬性(Abstract),并且說(shuō)明了如何在子類中丟棄它.好,下面讓我們開(kāi)始吧.
例子一:
000: // Properties\person.cs
001: using System;
002: class Person
003: {
004: private string myName ="N/A";
005: private int myAge = 0;
006:
007: // 聲明一個(gè)字符型的屬性Name
008: public string Name
009: {
010: get
011: {
012: return myName;
013: }
014: set
015: {
016: myName = value;
017: }
018: }
019:
020: // 聲明一個(gè)int型的Age屬性
021: public int Age
022: {
023: get
024: {
025: return myAge;
026: }
027: set
028: {
029: myAge = value;
030: }
031: }
032:
033: public override string ToString()
034: {
035: return "Name = " + Name + ", Age = " + Age;
036: }
037:
038: public static void Main()
039: {
040: Console.WriteLine("Simple Properties");
041:
042: // 建立一個(gè)Person的實(shí)例
043: Person person = new Person();
044:
045: //打印出它的屬性
046: Console.WriteLine("Person details - {0}", person);
047:
048: // 對(duì)屬性進(jìn)行一些設(shè)置
049: person.Name = "Joe";
050: person.Age = 99;
051: Console.WriteLine("Person details - {0}", person);
052:
053: // 增加年齡
054: person.Age += 1;
055: Console.WriteLine("Person details - {0}", person);
056: }
057: }
這個(gè)例子的輸出是:
Simple Properties
Person details - Name = N/A, Age = 0
Person details - Name = Joe, Age = 99
Person details - Name = Joe, Age = 100
好了,又起床了,昨天寫(xiě)到這,就跑到床上睡了,呵呵.現(xiàn)在是五一的第二天,看看我今天能寫(xiě)幾篇,昨天寫(xiě)了二篇.
從上面的程序我們可以看出,一個(gè)類的屬性的設(shè)置,借用了VB的概念,和JAVA中不盡相同了.(這就是M$,TMD!)有的朋友可能很奇怪,為什么我們可以用Console.WriteLine()來(lái)打印一個(gè)對(duì)象person呢.其實(shí)道理很簡(jiǎn)單,和在JAVA中的一樣,當(dāng)調(diào)節(jié)器用一個(gè)打印方法時(shí),這個(gè)對(duì)象自動(dòng)調(diào)用它的ToString()(在JAVA中是toString,TMD,又差點(diǎn)犯錯(cuò)!)方法.在33行,我們可以看到有這個(gè)方法的影子,override這個(gè)關(guān)鍵字大概就是覆蓋父類的方法吧,這是不是有點(diǎn)多余?我們可以看到,一個(gè)對(duì)象的屬性的設(shè)置是通過(guò)一個(gè)get()和set()組合來(lái)完成的,當(dāng)然,還有一個(gè)value這個(gè)東東.補(bǔ)充一下,你還可以控制一個(gè)屬性的讀/寫(xiě)權(quán)限,只是把get()和set()簡(jiǎn)單地去掉就可以了,比如你不要寫(xiě)的屬性,就不要set()就可以了,如果你不要讀,就不要get()吧.總得感覺(jué),C#在這點(diǎn)上沒(méi)有JAVA來(lái)的靈活(完了,又要被蓋癡打了!).
第二個(gè)例子:
這個(gè)例子說(shuō)明了如何建立抽象的屬性(Abstract),什么是抽象的屬性呢,所謂的抽象的屬性呢,就是....(唉,每次廢話都這么多!FT) 一個(gè)抽象類并不提供執(zhí)行屬性存取程序,并且,他可以在子類中被忽略.下面的例子有三個(gè)文件,你要分別編譯它們才能得到結(jié)果,它們是:
abstractshape.cs: Shape類,包含一個(gè)Area抽象屬性
shapes.cs: Shape的子類
shapetest.cs: 顯示程序.
要編譯這些程序,運(yùn)行:csc abstractshape.cs shapes.cs shapetest.cs就可以了.運(yùn)行完之后,它會(huì)產(chǎn)生shapetest.exe這個(gè)可執(zhí)行程序.
000: // Properties\abstractshape.cs
001: using System;
002:
003: public abstract class Shape
004: {
005: private string myId;
006:
007: public Shape(string s)
008: {
009: Id = s; // 這句調(diào)用了Id屬性的set構(gòu)建器
010: }
011:
012: public string Id
013: {
014: get
015: {
016: return myId;
017: }
018:
019: set
020: {
021: myId = value;
022: }
023: }
024:
025: public abstract double Area
026: {
027: get;
028: }
029:
030: public override string ToString()
031: {
032: return Id + " Area = " + double.Format(Area, "F");
033: }
034: }
看這個(gè)程序, 實(shí)際上非常地簡(jiǎn)單,當(dāng)這個(gè)類對(duì)的對(duì)象被建立時(shí),初始化部分為007-010,它把建立對(duì)象的參數(shù)s給了Id這個(gè)屬性.然后進(jìn)行了上一個(gè)例子的操作.實(shí)際上,我們可以把抽象屬性與JAVA中的接口(Interface)相比,它們只提拱一個(gè)方法的名稱,而不提供這個(gè)方法的內(nèi)容.就像Area這個(gè)抽象屬性,有一個(gè)get,但是它并沒(méi)有指定get方法(也許它不能稱之為方法)里的內(nèi)容,即要get做什么事情. 這個(gè)事情,由它的子類來(lái)做.
第二個(gè)文件:在這個(gè)文件中,一個(gè)類覆蓋了(override)了Area屬性.
000: // Properties\shapes.cs
001: public class Square : Shape
002: {
003: private int mySide;
004:
005: public Square(int side, string id) : base(id)
006: {
007: mySide = side;
008: }
009:
010: public override double Area
011: {
012: get
013: {
014: return mySide * mySide;
015: }
016: }
017: }
018:
019: public class Circle : Shape
020: {
021: private int myRadius;
022:
023: public Circle(int radius, string id) : base(id)
024: {
025: myRadius = radius;
026: }
027:
028: public override double Area
029: {
030: get
031: {
032: return myRadius * myRadius * System.Math.PI;
033: }
034: }
035: }
036:
037: public class Rectangle : Shape
038: {
039: private int myWidth;
040: private int myHeight;
041:
042: public Rectangle(int width, int height, string id) : base(id)
043: {
044: myWidth = width;
045: myHeight = height;
046: }
047:
048: public override double Area
049: {
050: get
051: {
052: return myWidth * myHeight;
053: }
054: }
055: }
這個(gè)例子就有些讓我們一頭霧水了,:是干什么的,好象是繼承,相當(dāng)于JAVA中的extends吧.我想是的.我們先看一看吧.
下面的第三個(gè)文件就是一個(gè)測(cè)試文件了,很簡(jiǎn)單,大家看一看.
000: // Properties\shapetest.cs
001: public class TestClass
002: {
003: public static void Main()
004: {
005: Shape[] shapes =
006: {
007: new Square(5, "Square #1"),
008: new Circle(3, "Circle #1"),
009: new Rectangle( 4, 5, "Rectangle #1")
010: };
011:
012: System.Console.WriteLine("Shapes Collection");
013: foreach(Shape s in shapes)
014: {
015: System.Console.WriteLine(s);
016: }
017:
018: }
019: }
從這個(gè)例子上看,:這個(gè)符號(hào)的確是extends的意思,就是繼承.繼承是什么意思,說(shuō)白了,就是生孩子的意思.比如下面一句sunwenson extends sunwen,這名就是說(shuō)sunwenson這個(gè)類繼承了sunwen,sunwenson這個(gè)類有sunwen類的所有東西,同時(shí)可以添加和刪除sunwen中的一些東西.就這么簡(jiǎn)單,但是這是現(xiàn)代軟件發(fā)展的一項(xiàng)重要技術(shù),因?yàn)樗梢允管浖闹赜眯源蟠筇岣?唉,這些就只有大三大四的人說(shuō)了,我就沒(méi)資格了.呵呵.
這個(gè)程序的輸出是:
Shapes Collection
Square #1 Area = 25.00
Circle #1 Area = 28.27
Rectangle #1 Area = 20.00
完了,這一節(jié)又完了.要理解這一節(jié),有一定的難度, 特別對(duì)那些沒(méi)有JAVA或C++編程經(jīng)驗(yàn)的朋友.不過(guò)不要害怕,鼓起勇氣學(xué)下去,一定會(huì)有所收獲的. 我也要休息一下了,嘿嘿,早飯還沒(méi)有吃呢!