本文介紹了C#面向對象編程語言的三個基礎特征:封裝、繼承和多態。其中,封裝可以通過public、private、protected、internal等關鍵字來實現,目的是保護程式內部數據的完整性;繼承可以幫助實現基類的內容復用,但也要結合場景使用;多態是指相同類型對象調用相同方法卻表現出不同行為,使... ...
C# 是面向對象的語言,每次到這裡就會有一個問題,什麼是對象,其實一句話就可以解釋,那就是——萬物皆是對象,這句話就像 “如來”一樣抽象,其實,我們無須在這上面耗費太大的精力,我們隨著學習的深入,對象的概念自然會深入到腦海中
所有面向對象的編程語言都有以下三個基礎特征
- 封裝——把客觀的事物封裝成類,並將類內部實現隱藏
- 繼承——通過繼承可以復用父類的代碼
- 多態——允許將子對象賦值給父對象的一種能力
1.封裝
封裝是把類的內部數據隱藏,不讓對象實例直接對齊操作,C# 提供屬性機制來對內部的狀態進行操作,在 C# 中封裝可以通過public、private、protected、internal等關鍵字來體現
為什麼要進行封裝呢?
封裝是一種程式內部的保護機制,保護數據的完整性,
例如:我定義一個人的類,創建了它的對象,將其內部的age屬性賦值為 -5 ;但是我們都知道,人的年齡是沒有-5的,這種隨意的賦值,就破壞了數據的完整性
解決上面的情況,就需要使用下麵的這種方式
public class Person
{
private string _name;
private int _age;
public string Name {
get { return _name; }
set { _name = value; }
}
public int Age {
get { return _age; }
set {
if(value < 0 || value > 120)
{
throw(new ArgumentOutOfRangeException("AgeIntPropery",value,"年齡必須在0~120之間"));
}else {
_age = value;
}
}
}
}
2.繼承
在 C# 中一個類可以繼承另外一個已有的類,(密封類除外),被繼承的類被稱為基類或者父類
為什麼需要繼承呢?
繼承的作用主要是為了復用基類的內容,但是繼承也有自己的缺點,就是耦合性太大,要結合場景來使用
class Program
{
static void Main(string[] args)
{
Horse horse = new Horse();
horse.Age = 2;
Sheep sheep = new Sheep();
sheep.Age = 1;
Console.WriteLine("羊的年齡:{0}",sheep.Age);
Console.Read();
}
}
public class Animal
{
private int _age;
public int Age
{
get { return _age; }
set
{
if(value < 0 || value > 10)
{
throw (new ArgumentOutOfRangeException("AgeIntProperty",value,"年齡必須在0-10之間"))
}
_age = value;
}
}
}
public class Horse:Animal{}
public class Sheep:Animal{}
2.1 密封類
密封類不能被另外一個類繼承,如果強行繼承,就會編譯錯誤
public sealed class SealedClass
{
// 在這裡定義類成員
}
// 下麵的代碼會編譯錯誤
public class Test:SealedClass{
}
2.2 子類初始化的順序
繼承之後,我們不僅僅會調用子類的構造函數,還會調用基類的構造函數,子類的初始化順序如下:
- 初始化類的實例欄位
- 調用基類的構造函數,如果沒有指明基類,則調用System.Object構造函數
- 調用子類的構造函數
class Program
{
static void Main(string[] args)
{
Horse horse = new Horse();
horse.Age = 2;
Sheep sheep = new Sheep();
sheep.Age = 1;
Console.WriteLine("羊的年齡:{0}",sheep.Age);
Console.Read();
}
}
public class Animal
{
// 2.初始化基類的成員變數
private int _age;
public int Age
{
get { return _age; }
set
{
if(value < 0 || value > 10)
{
throw (new ArgumentOutOfRangeException("AgeIntProperty",value,"年齡必須在0-10之間"));
}
_age = value;
}
}
// 3.調用基類的構造
public Animal() {
}
}
public class Horse:Animal{
// 1.先初始化
private string run;
// 4.調用子類構造
public Horse() {
}
}
public class Sheep:Animal{
private string eat;
public Sheep() {
}
}
3.多態
由於有了繼承,子類需要覆寫父類中的方法,來實現子類特有的行為,這樣的技術在面向對象的編程就是多態,多態即相同類型對象調用相同的方法,卻表現出不同的行為
3.1 使用 virtual 和 override 關鍵字來實現方法重寫
只有基類聲明為 virtual
或 abstract 時,才可以被派生類重寫;而子類想要改變虛方法的實現行為,只能使用override關鍵字
class Program
{
static void Main(string[] args)
{
Animal horse = new Horse();
horse.Voice();
Animal sheep = new Sheep();
// 相同類型對象,調用相同的方法,表現出的行為不同
sheep.Voice();
Console.Read();
}
}
public abstract class Animal
{
private int _age;
public int Age
{
get { return _age; }
set
{
if (value < 0 || value > 10)
{
throw (new ArgumentOutOfRangeException("AgeIntProperty", value, "年齡必須在0-10之間"));
}
_age = value;
}
}
public virtual void Voice()
{
Console.WriteLine("動物開始發出聲音");
}
}
public class Horse : Animal
{
public override void Voice()
{
// 調用基類的方法
base.Voice();
Console.WriteLine("