標籤:
一、物件導向的核心概念
(一)抽象——物件導向的根基
講到抽象,不得不涉及到現代科學技術的基礎——數學。
數學是一門抽象的科學,面對著紛繁複雜的世間萬物,數學不理會各種事物的獨特特性,而只抽取它們在數量上的特性,深刻揭示了“世間萬物”在數量上表現出的共同規律,抽象正是數學的本質特徵。
數學的一個分支——離散數學是電腦科學的根基之一,因此,電腦科學從誕生之日起,就與數學有著密不可分的聯絡,抽象思維也是電腦科學的主要思維方法之一。
在使用物件導向的方法設計一個軟體系統時,首先就要區分出現實世界中的事物所屬的類型,分析它們擁有哪些性質與功能,再將它們抽象為在電腦虛擬世界中才有意義的實體——類,在程式運行時,由類建立出對象,用對象之間的相互合作關係來類比真實世界中事物的相互關聯。
在從真實世界到電腦虛擬世界的轉換過程中,抽象起了關鍵的作用。
(二)物件導向的三大基本特性
1.封裝
封裝的類=資料+對此資料所進行的操作(即演算法)
通俗的說,封裝就是:包起外界不必需要知道的東西,只向外界展露可供展示的東西。
2.繼承
真實世界中,事物之間有著一種派生關係,比如“食品”這一大類中包括“水果”這一子類,而“蘋果”又包含在“水果”這一子類中。
在電腦世界中,以物件導向的觀點不僅將上述事物抽象為類,而且將事物之間的派生關係也一併類比出來,這種關係稱為“繼承”。
在物件導向軟體系統中,繼承除了類比現實世界中事物關係這一作用,還是一個“重用已有代碼而又不破壞已有代碼”的方法。
3.多態
在代碼中本應使用某一具體子類的地方使用較為抽象的基類對象,這種方法所帶來的好處是多態的代碼具有“變色龍”的特性,即在不同的條件下,同樣代碼可以完成不同的功能。
二、類與對象
(一)類是物件導向編程的基本單元。
(二)欄位即變數,方法即函數。
函數分為變數函數(欄位的保護),行為函數。
執行個體方法:對象可以調用,類不能調用。
方法的重載:1.同名2.參數類型不同或個數不同
(三)傳值與傳址
傳值引用:整形變數,浮點型變數,結構體,日期時間(儲存在棧空間)
傳址引用:字串,數組,類。(儲存在堆空間)
例題:小狗——類的傳址引用
class dog { public string name; public void bark() { Console.WriteLine("汪汪,我的名字叫"+name); } } static void Main(string[] args) { dog a = new dog(); dog b = new dog(); a.name = "旺財"; b.name = "守家"; a.bark(); b.bark(); //將a的引用地址複製給c,a和c將同時控制同一個對象; //c將對象屬性改變後,a指向的也是一個改變後的對象。 dog c = a; c.name = "大黃"; a.bark(); //將b的引用地址複製給a和c,a、b、c、控制同一個對象; //a、b原來指向的對象沒有地址指向它,無法被調用,稱為垃圾。 a = b; c = b; a.bark(); b.bark(); c.bark();
例題:用oop解決泳池問題
//建立圓的類 class circle { public double r; public double getLength() { double l = 2 * 3.14 * r; return l; } public double getArea() { double s = 3.14 * r * r; return s; } } //求遊泳池的周長和廣場面積 static void Main(string[] args) { circle small = new circle(); circle big = new circle(); Console.Write("請輸入小圓半徑"); small.r=Convert.ToInt32(Console.ReadLine()); Console.Write("請輸入大圓半徑"); big.r = Convert.ToInt32(Console.ReadLine()); Console.WriteLine("泳池周長:"+small.getLength()); Console.WriteLine("廣場面積:"+(big.getArea()-small.getArea())); }
例題:狗咬狗——方法的重載
class dog { public string name; public int HP = 100; public void bark() { Console.WriteLine("汪汪,我的名字叫" + name); } public void bite(dog op) { Console.WriteLine(name + "開始攻擊" + op.name); op.HP -= 10; Console.WriteLine(name + "的血量:" + HP + "\n" + op.name + "的血量:" + op.HP); } } class people { public string name; public void attackDog(dog op) { op.HP -= 10; Console.WriteLine(name+"開始打狗\n"+op.name+"的血量:"+op.HP); } public void attackDog(dog op, int blood) { op.HP -= blood; Console.WriteLine(name+"開始打狗\n"+op.name+"的血量:"+op.HP); } } static void Main(string[] args) { //狗咬狗 dog a = new dog(); dog b = new dog(); a.name = "旺財"; b.name = "守家"; a.bite(b); b.bite(a); //人打狗,函數的重載 people h = new people(); h.name = "秋香"; h.attackDog(a); h.attackDog(a,15); }
例題:opp的欄位保護——學生資訊
class student { /*通過設定private,在本類之外無法直接操作該類的欄位, 必須通過調用該類的函數(稱為變數函數)來訪問,起到保護欄位的作用*/ public string name; private int height; private int weight; public void setHeight(int a) { if (a > 0 && a < 1000) { height = a; } else { Console.WriteLine("身高輸入不正確"); } } public int getHeight() { return height; } public void setWeight(int a) { if (a > 0 && a <= 1000) { weight = a; } else { Console.WriteLine("體重輸入不正確"); } } public int getWeight() { return weight; } public void speak() { Console.WriteLine("我叫"+name+";體重:"+weight+"千克。身高:"+height+"cm"); } } static void Main(string[] args) { student a = new student(); a.name = "王小明"; a.setHeight(170); a.setWeight(80); a.speak(); }
C#物件導向的核心概念