对C#面向对象三大特性的一点总结
一、三大特性
封裝: 把客觀事物封裝成類,并把類內部的實現隱藏,以保證數據的完整性
繼承:通過繼承可以復用父類的代碼
多態:允許將子對象賦值給父對象的一種能力
二、【封裝】特性
把類內部的數據隱藏,不讓對象實例直接對其操作,通過給類及類中的成員變量、屬性和方法設置不同的訪問修飾符(public、protected、internal、
protected internal、private)來控制它們的作用范圍,以達到封裝的目的。
實例:
(1)? 沒有封裝的類:
1 public class Animal 2 { 3 public string _name; 4 public int _age; 5 } 6 static void Main(string[] args) 7 { 8 Animal animal = new Animal(); 9 animal._name = "sheep"; 10 animal._age = -1; 11 }(2)? 封裝后的類:
1 public class Animal 2 { 3 private string _name; 4 private int _age; 5 6 public string Name 7 { 8 get { return _name; } 9 set { _name = value; } 10 } 11 12 public int Age 13 { 14 get { return _age; } 15 set 16 { 17 if (value < 0 || value > 10) 18 { 19 throw (new AggregateException("年齡必須在0~10歲之間!")); 20 } 21 _age = value; 22 } 23 } 24 }?二、【繼承】特性
1、通過繼承,程序可實現對父類代碼的復用,子類繼承父類的所有成員(構造函數 、析構函數、靜態類、密封類除外),子類無需再定義父類中已有定義的代碼。
2、被繼承的類成為父類、基類、超類,而主動繼承的類成為子類或派生類,Object是所有類的基類。
3、當父類和子類中有名稱相同的方法時,父類中的方法會被隱藏
4、里氏替換原則:子類對象可以賦值給父類變量,反之不成立
5、子類不能對父類的私有成員進行訪問,只能對公有成員和保護成員訪問,但子類可以通過調用公有成員或保護方法間接的對私有成員進行訪問
? 實例:
1 //基類:Animal 2 public class Animal 3 { 4 private string _name; 5 private int _age; 6 7 public string Name 8 { 9 get { return _name; } 10 set { _name = value; } 11 } 12 13 public int Age 14 { 15 get { return _age; } 16 set 17 { 18 if (value < 0 || value > 10) 19 { 20 throw (new AggregateException("年齡必須在0~10歲之間!")); 21 } 22 _age = value; 23 } 24 } 25 } 26 27 //子類:羊 28 public class Sheep : Animal 29 { 30 31 } 32 33 //子類:馬 34 public class Horse : Animal 35 { 36 37 } 38 39 static void Main(string[] args) 40 { 41 Sheep sheep = new Sheep(); 42 sheep.Name = "Xi Yangyang"; 43 sheep.Age = 5; 44 45 Horse horse = new Horse(); 46 horse.Name = "Qian Li"; 47 horse.Age = 6; 48 } View Code?三、【多態】特性
1、相同類型的對象調用相同的方法表現出不同的行為。
2、兩種表現形式:重載、重寫
3、重載:同一個類中有多個方法的名稱相同、參數個數不同或類型不同
4、重寫:使用 virtua l和 override 關鍵字實現方法重寫,只有基類成員聲明為virtual 或 abstract,才能被派生類重寫。
5、以下3種情況重寫:
a、當類為普通類時,只有父類的虛方法才能被子類重寫,子類實現重寫要用關鍵字override,如果不加override就會隱藏父類的方法,
? ?隱藏需要加上關鍵字new,例如:
public new static void a()
{
}
或
public static new void a()
{
}?
靜態類中只能有靜態成員,非靜態類中可以有靜態成員和非靜態成員。?
靜態方法不能被重寫,但可以被隱藏。?
? ? ? ? ? ?靜態成員不能帶override、abstract、virtual。
b、抽象類中可以有抽象屬性、抽象方法和成員實例,繼承抽象類的子類必須直接或間接重寫所有的抽象方法,而且參數和返回值類型必須完全一致,
? ?成員實例可以不被重寫。
? 非抽象類中只能有成員實例。
? 抽象類不能直接實例化,但是有構造方法,可以利用里氏替換原則把子類對象賦值給抽象的父類變量。
? 抽象方法必須用abstract修飾,而且不能有方法體。
? 抽象方法不能用private修飾。
c、類是單繼承,接口是多繼承,如果同時繼承類和接口的話,接口必須在基類的后面,否則編譯會出錯。
??接口不能直接實例化,沒有構造方法,可以利用里氏替換原則把子類對象賦值給接口類型的父類變量。
??接口中的成員沒有訪問修飾符,默認是public類型的,而且不能手動添加任何訪問修飾符。
??實現接口時不需要override,實現接口的類中的方法的參數和返回值類型必須與接口中定義的類型完全一致。?
? 接口命名一般以I開頭,表示某種功能,實現某一接口表示具備了某一功能。
6、使用sealed關鍵字阻止派生類重寫基類虛成員。
7、使用New關鍵字隱藏基類成員:當子類中需要添加的方法與基類中的方法名相同,使用new關鍵字隱藏基類方法,但如果想要強制訪問基類方法,
?則可使用強制類型轉換,把子類強制轉換成基類類型,例如:
1 //基類:Animal 2 public class Animal 3 { 4 private string _name; 5 private int _age; 6 7 public string Name 8 { 9 get { return _name; } 10 set { _name = value; } 11 } 12 13 public int Age 14 { 15 get { return _age; } 16 set 17 { 18 if (value < 0 || value > 10) 19 { 20 throw (new AggregateException("年齡必須在0~10歲之間!")); 21 } 22 _age = value; 23 } 24 } 25 26 public void Eat() 27 { 28 Console.WriteLine("動物的吃方法"); 29 } 30 } 31 32 //子類:羊 33 public class Sheep : Animal 34 { 35 public new void Eat() 36 { 37 Console.WriteLine("羊的吃方法"); 38 } 39 } 40 41 static void Main(string[] args) 42 { 43 Sheep sheep = new Sheep(); 44 sheep.Name = "Xi Yangyang"; 45 sheep.Age = 5; 46 sheep.Eat(); 47 ((Animal)sheep).Eat(); //子類強制轉換成基類方法 48 49 Horse horse = new Horse(); 50 horse.Name = "Qian Li"; 51 horse.Age = 6; 52 53 Console.Read(); 54 } View Code?
? ?
?
轉載于:https://www.cnblogs.com/goldendragon/p/10075044.html
總結
以上是生活随笔為你收集整理的对C#面向对象三大特性的一点总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ3473: 字符串【后缀数组+思
- 下一篇: c# char unsigned_dll