程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> SUNWEN教程之----C#進階4

SUNWEN教程之----C#進階4

編輯:關於C語言

大家好,我是武漢華師的SUNWEN.呵呵,下午好不容易有了時間出去玩了,到了歸元寺.門票十元,不算貴,SUNWEN照了好多像,用不了多久,就可以讓大家看一看了.

閒話少說,讓我們進入正題.這次我要向大家講的是C#中的屬性.屬性是什麼呢,比如說我是男的,男就是我的一人屬性.我是一個大一的學生,大一也是我的一個屬性.屬性就是一個對象的性質.很簡單吧,呵呵!下面,我給出兩個例子,第一個例子出明了如何聲明一個可以修改的屬性,另一個例了建立了一個抽象的屬性(Abstract),並且說明了如何在子類中丟棄它.好,下面讓我們開始吧.

例子一:


000: // PropertIEs\person.cs
001: using System;
002: class Person
003: {
004:     private string myName ="N/A";
005:     private int myAge = 0;
006:
007:     // 聲明一個字符型的屬性Name
008:     public string Name
009:     {
010:         get
011:         {
012:            return myName;
013:         }
014:         set
015:         {
016:            myName = value;
017:         }
018:     }
019:
020:     // 聲明一個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:         // 建立一個Person的實例
043:         Person person = new Person();
044:
045:         //打印出它的屬性
046:         Console.WriteLine("Person details - {0}", person);
047:
048:         // 對屬性進行一些設置
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: }
這個例子的輸出是:

Simple PropertIEs
Person details - Name = N/A, Age = 0
Person details - Name = Joe, Age = 99
Person details - Name = Joe, Age = 100

好了,又起床了,昨天寫到這,就跑到床上睡了,呵呵.現在是五一的第二天,看看我今天能寫幾篇,昨天寫了二篇.

從上面的程序我們可以看出,一個類的屬性的設置,借用了VB的概念,和JAVA中不盡相同了.(這就是M$,TMD!)有的朋友可能很奇怪,為什麼我們可以用Console.WriteLine()來打印一個對象person呢.其實道理很簡單,和在JAVA中的一樣,當調節器用一個打印方法時,這個對象自動調用它的ToString()(在JAVA中是toString,TMD,又差點犯錯!)方法.在33行,我們可以看到有這個方法的影子,override這個關鍵字大概就是覆蓋父類的方法吧,這是不是有點多余?我們可以看到,一個對象的屬性的設置是通過一個get()和set()組合來完成的,當然,還有一個value這個東東.補充一下,你還可以控制一個屬性的讀/寫權限,只是把get()和set()簡單地去掉就可以了,比如你不要寫的屬性,就不要set()就可以了,如果你不要讀,就不要get()吧.總得感覺,C#在這點上沒有Java來的靈活(完了,又要被蓋癡打了!).

第二個例子:

這個例子說明了如何建立抽象的屬性(Abstract),什麼是抽象的屬性呢,所謂的抽象的屬性呢,就是....(唉,每次廢話都這麼多!FT) 一個抽象類並不提供執行屬性存取程序,並且,他可以在子類中被忽略.下面的例子有三個文件,你要分別編譯它們才能得到結果,它們是:

abstractshape.cs: Shape類,包含一個Area抽象屬性
shapes.cs: Shape的子類
shapetest.cs: 顯示程序.
要編譯這些程序,運行:csc abstractshape.cs shapes.cs shapetest.cs就可以了.運行完之後,它會產生shapetest.exe這個可執行程序.

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;   // 這句調用了Id屬性的set構建器
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: }
看這個程序, 實際上非常地簡單,當這個類對的對象被建立時,初始化部分為007-010,它把建立對象的參數s給了Id這個屬性.然後進行了上一個例子的操作.實際上,我們可以把抽象屬性與Java中的接口(Interface)相比,它們只提拱一個方法的名稱,而不提供這個方法的內容.就像Area這個抽象屬性,有一個get,但是它並沒有指定get方法(也許它不能稱之為方法)裡的內容,即要get做什麼事情. 這個事情,由它的子類來做.

第二個文件:在這個文件中,一個類覆蓋了(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: }
這個例子就有些讓我們一頭霧水了,:是干什麼的,好象是繼承,相當於Java中的extends吧.我想是的.我們先看一看吧.

下面的第三個文件就是一個測試文件了,很簡單,大家看一看.

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: }
從這個例子上看,:這個符號的確是extends的意思,就是繼承.繼承是什麼意思,說白了,就是生孩子的意思.比如下面一句sunwenson extends sunwen,這名就是說sunwenson這個類繼承了sunwen,sunwenson這個類有sunwen類的所有東西,同時可以添加和刪除sunwen中的一些東西.就這麼簡單,但是這是現代軟件發展的一項重要技術,因為它可以使軟件的重用性大大提高.唉,這些就只有大三大四的人說了,我就沒資格了.呵呵.

這個程序的輸出是:

Shapes Collection
Square #1 Area = 25.00
Circle #1 Area = 28.27
Rectangle #1 Area = 20.00
完了,這一節又完了.要理解這一節,有一定的難度, 特別對那些沒有Java或C++編程經驗的朋友.不過不要害怕,鼓起勇氣學下去,一定會有所收獲的. 我也要休息一下了,嘿嘿,早飯還沒有吃呢!

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved