C# 面向對象編程技術概述
C# 是一種現代化的面向對象編程語言,提供了豐富的特性來支持面向對象的編程范式。以下是 C# 中面向對象編程的核心概念和技術:
核心概念
1. 類與對象
類是對象的藍圖,定義了對象的屬性和行為。對象是類的實例。
// 定義一個類
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)age = value;elsethrow new ArgumentException("年齡不能為負數");}}// 構造函數public Person(string name, int age){Name = name;Age = age;}// 方法public void SayHello(){Console.WriteLine($"你好,我是{Name},今年{Age}歲。");}
}// 創建對象并使用
Person person = new Person("張三", 30);
person.SayHello(); // 輸出: 你好,我是張三,今年30歲。
2. 繼承
繼承允許創建一個新類(子類)來繼承現有類(父類)的屬性和方法。
// 父類
public class Animal
{public string Name { get; set; }public Animal(string name){Name = name;}public void Eat(){Console.WriteLine($"{Name}正在吃東西。");}
}// 子類
public class Dog : Animal
{public Dog(string name) : base(name) { }// 新增方法public void Bark(){Console.WriteLine($"{Name}正在叫。");}
}// 使用繼承
Dog dog = new Dog("旺財");
dog.Eat(); // 輸出: 旺財正在吃東西。
dog.Bark(); // 輸出: 旺財正在叫。
3. 多態
多態允許通過父類類型引用子類對象,并在運行時決定調用哪個方法。
// 基類
public abstract class Shape
{public abstract double Area(); // 抽象方法
}// 子類
public class Circle : Shape
{public double Radius { get; set; }public Circle(double radius){Radius = radius;}public override double Area(){return Math.PI * Radius * Radius;}
}public class Rectangle : Shape
{public double Width { get; set; }public double Height { get; set; }public Rectangle(double width, double height){Width = width;Height = height;}public override double Area(){return Width * Height;}
}// 使用多態
Shape circle = new Circle(5);
Shape rectangle = new Rectangle(4, 6);Console.WriteLine($"圓的面積: {circle.Area()}"); // 輸出: 圓的面積: 78.5398163397448
Console.WriteLine($"矩形的面積: {rectangle.Area()}"); // 輸出: 矩形的面積: 24
4. 封裝
封裝通過訪問修飾符(如 public
, private
, protected
)控制類成員的訪問級別。
public class BankAccount
{private double balance; // 私有字段,外部無法直接訪問public void Deposit(double amount){if (amount > 0)balance += amount;}public bool Withdraw(double amount){if (amount > 0 && balance >= amount){balance -= amount;return true;}return false;}public double GetBalance(){return balance;}
}// 使用封裝
BankAccount account = new BankAccount();
account.Deposit(1000);
bool success = account.Withdraw(500);
Console.WriteLine($"取款成功: {success}, 余額: {account.GetBalance()}");
// 輸出: 取款成功: True, 余額: 500
高級特性
1. 接口
接口定義了一組方法簽名,但不包含實現。類可以實現多個接口。
// 定義接口
public interface IAnimal
{void Eat();void Sleep();
}// 實現接口
public class Cat : IAnimal
{public void Eat(){Console.WriteLine("貓吃魚");}public void Sleep(){Console.WriteLine("貓睡覺");}
}// 使用接口
IAnimal cat = new Cat();
cat.Eat(); // 輸出: 貓吃魚
cat.Sleep(); // 輸出: 貓睡覺
2. 抽象類
抽象類不能實例化,只能作為基類。它可以包含抽象方法和非抽象方法。
// 抽象類
public abstract class Vehicle
{public abstract void Start(); // 抽象方法public void Stop(){Console.WriteLine("車輛停止");}
}// 具體類
public class Car : Vehicle
{public override void Start(){Console.WriteLine("汽車啟動");}
}// 使用抽象類
Vehicle car = new Car();
car.Start(); // 輸出: 汽車啟動
car.Stop(); // 輸出: 車輛停止
3. 事件與委托
委托是一種類型,它可以引用一個或多個方法。事件基于委托,用于實現發布-訂閱模式。
// 定義委托
public delegate void EventHandler(string message);// 發布者類
public class Publisher
{// 定義事件public event EventHandler? MyEvent;public void RaiseEvent(){MyEvent?.Invoke("事件被觸發");}
}// 訂閱者類
public class Subscriber
{public void HandleEvent(string message){Console.WriteLine($"收到消息: {message}");}
}// 使用事件和委托
Publisher publisher = new Publisher();
Subscriber subscriber = new Subscriber();// 訂閱事件
publisher.MyEvent += subscriber.HandleEvent;// 觸發事件
publisher.RaiseEvent(); // 輸出: 收到消息: 事件被觸發
4. 特性(Attributes)
特性用于為程序元素(類、方法、屬性等)添加元數據。
// 自定義特性
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class DescriptionAttribute : Attribute
{public string Description { get; }public DescriptionAttribute(string description){Description = description;}
}// 應用特性
[Description("這是一個用戶類")]
public class User
{[Description("獲取用戶名")]public string GetUserName(){return "John Doe";}
}// 反射獲取特性信息
Type type = typeof(User);
DescriptionAttribute? classAttr = type.GetCustomAttribute<DescriptionAttribute>();
Console.WriteLine($"類描述: {classAttr?.Description}");MethodInfo method = type.GetMethod("GetUserName");
DescriptionAttribute? methodAttr = method?.GetCustomAttribute<DescriptionAttribute>();
Console.WriteLine($"方法描述: {methodAttr?.Description}");// 輸出:
// 類描述: 這是一個用戶類
// 方法描述: 獲取用戶名
總結
C# 的面向對象編程提供了豐富的特性,包括類、繼承、多態、封裝、接口、抽象類、事件委托和特性等。這些特性使得代碼更加模塊化、可維護和可擴展,是構建大型應用程序的基礎。