一、封裝
封裝:將類的某些信息隱藏在類的內部(用private修飾),不允許外部程序直接訪問,需要訪問也是訪問該類為其提供的公共屬性。
裝屬性的作用:防止類中的數據被惡意修改。
封裝屬性的好處:
1.可以隱藏類的實現細節
2.外部只能通過訪問規定的屬性來訪問數據,保護數據
3.方便加入控制語句,即對數據做約束
public class Person
{
// 私有字段
private string name;
private int age;
// 公共構造函數
public Person(string name, int age)
{
this.name = name;
this.age = age;
}
// 特性可以保護數據安全
public int Age
{
get { return age; }
set { age =value; }
}
// 公共方法,用于獲取姓名
public string GetName()
{
return name;
}
// 公共方法,用于設置姓名
public void SetName(string newName)
{
name = newName;
}
// 公共方法,用于獲取年齡
public int GetAge()
{
return age;
}
// 公共方法,用于設置年齡
public void SetAge(int newAge)
{
if (newAge > 0 && newAge < 150) // 簡單的年齡驗證邏輯
{
age = newAge;
}
else
{
throw new ArgumentOutOfRangeException("Invalid age.");
}
}
}
在上面的例子中,Person
類封裝了兩個私有字段name
和age
。通過公共的構造函數和設置器方法(如SetName
和SetAge
),我們可以控制對內部狀態的訪問和修改。這樣,外部代碼只能通過這些公共方法來訪問和修改Person
對象的內部狀態,而不能直接訪問或修改私有字段。這提高了代碼的可維護性和健壯性,因為我們可以控制對內部狀態的訪問和修改,并在必要時添加額外的驗證邏輯。
二、繼承
1. 代碼重用:繼承允許我們定義一個類,然后創建其他類從已有的類中派生出來。這樣,我們可以重用基類中的方法和屬性,減少代碼的重復編寫。
2. 擴展性:繼承使得我們能夠定義一個基類,然后根據需要創建派生類來擴展或修改基類的功能。這使得代碼更加靈活,可以根據需求進行擴展和定制。
3. 層次結構:通過繼承,我們可以建立類之間的層次結構,使得代碼更加有組織性和層次性。這有助于理解代碼的結構和功能,以及更好地進行代碼維護和調試。
4. 多態性:繼承是實現多態性的基礎。通過繼承,我們可以創建具有相同接口但具有不同實現的方法和屬性,從而實現多態性。這使得代碼更加靈活,可以根據實際需求選擇不同的實現方式。
代碼例子:
// 基類
public class Animal
{
public string Name { get; set; }
public void Eat()
{
Console.WriteLine($"{Name} is eating.");
}
}
// 派生類
public class Dog : Animal
{
public void Bark()
{
Console.WriteLine($"{Name} is barking.");
}
}
// 使用繼承
public class Program
{
public static void Main(string[] args)
{
Dog dog = new Dog();
dog.Name = "Tommy";
dog.Eat(); // 繼承了Animal類的Eat方法
dog.Bark(); // Dog類自己的Bark方法
}
}
繼承的特征:
1.子類繼承了父類的非私有的屬性與方法,構造方法除外
2.子類在創建構造方法時需要調用父類構造方法;
格式:派生類名(總參數列表(父子類的參數)):base(父類參數){}
3. 在創建子類對象時,系統會默認的先調用父類的構造方法,再調用子類的構造方法
4. 子類想使用父類的屬性和方法時,需要用到base關鍵字(base.)
重寫與重載的區別:
1.作用范圍不同,重寫發生在具有父子關系的兩個類中的同名方法,而重載是在同一個類中同名方法。
2.不同點不同,重寫的兩個方法的返回值與參數相同,方法的聲明不同(也就是{ }中的內容不同),重載的方法只要參數列表不同
三、多態
多態:是允許你將父對象設置成為和一個或更多的他的子對象相等的技術,賦值之后,父對象就可以根據當前賦值給它的子對象的特性以不同的方式運作。簡單地說,就是一句話:允許將子類類型的指針賦值給父類類型的指針。
代碼例子:
using System;
// 基類
class Animal
{
public void Speak()
{
Console.WriteLine("Animal speaks.");
}
}
// 派生類1
class Dog : Animal
{
public override void Speak()
{
Console.WriteLine("Dog barks.");
}
}
// 派生類2
class Cat : Animal
{
public override void Speak()
{
Console.WriteLine("Cat meows.");
}
}
class Program
{
static void Main()
{
// 創建一個Animal引用指向Dog對象
Animal myDog = new Dog();
// 調用基類Animal的Speak方法,實際上調用的是Dog的Speak方法,因為myDog是Animal類型,但實際上指向的是Dog對象。這就是多態性。
myDog.Speak(); // 輸出 "Dog barks."
// 創建一個Animal引用指向Cat對象
Animal myCat = new Cat();
// 同樣,調用基類Animal的Speak方法,實際上調用的是Cat的Speak方法。
myCat.Speak(); // 輸出 "Cat meows."
}
}
在這個例子中,我們有一個基類Animal和兩個派生類Dog和Cat。每個派生類都重寫了基類的Speak方法。在主程序中,我們創建了一個Animal類型的引用,但實際上它指向了一個Dog對象或一個Cat對象。當我們調用這個引用的Speak方法時,會調用實際對象的Speak方法,這就是多態性的體現。
該文章在 2025/1/26 10:16:44 編輯過