物件導向特性
封裝(Encapsulation)
抽象:對一件事物只瞭解其外在,而不需瞭解其內部構造或實作方法
封裝的觀念和抽象化類似,但多了安全的概念,使用者只能使用公開的屬性或方法
打個比方來說,以下的程式Deposit、Withdraw、BankAccount為公開的屬性或方法,使用這些函式增減private decimal balance 的數據,而這個balance是私有參數,不能直接修改與瀏覽數值,要透過公開方法取得數值
using System;
class BankAccount
{
private string accountNumber;
private decimal balance;
public BankAccount(string accountNumber, decimal initialBalance)
{
this.accountNumber = accountNumber;
this.balance = initialBalance;
}
public decimal GetBalance()
{
return balance;
}
public void Deposit(decimal amount)
{
if (amount > 0)
{
balance += amount;
Console.WriteLine($"存款 {amount} 元成功。新餘額為 {balance} 元。");
}
else
{
Console.WriteLine("無效的存款金額。");
}
}
public void Withdraw(decimal amount)
{
if (amount > 0 && amount <= balance)
{
balance -= amount;
Console.WriteLine($"取款 {amount} 元成功。新餘額為 {balance} 元。");
}
else
{
Console.WriteLine("無效的取款金額或餘額不足。");
}
}
}
class Program
{
static void Main()
{
BankAccount account = new BankAccount("123456789", 1000);
Console.WriteLine($"帳戶餘額:{account.GetBalance()} 元");
account.Deposit(500);
account.Withdraw(200);
}
}
繼承(Inheritance)
類別可以繼承另一個類別的屬性和方法,比方說有個動物的類別會吃、睡,有名字與年紀,在這個類別的基礎上再分成狗或貓,狗會旺旺叫而貓會咪咪叫,而在宣告類別的時候都是新增物件後再進行各種處理。
using System;
// 基類 Animal
class Animal
{
public string Name { get; set; }
public int Age { get; set; }
public Animal(string name, int age)
{
Name = name;
Age = age;
}
public void Eat()
{
Console.WriteLine($"{Name}正在吃食物。");
}
public void Sleep()
{
Console.WriteLine($"{Name}正在睡覺。");
}
}
// 派生類 Dog
class Dog : Animal
{
public string Breed { get; set; }
public Dog(string name, int age, string breed) : base(name, age)
{
Breed = breed;
}
public void Bark()
{
Console.WriteLine($"{Name}正在汪汪叫。");
}
}
// 派生類 Cat
class Cat : Animal
{
public string Color { get; set; }
public Cat(string name, int age, string color) : base(name, age)
{
Color = color;
}
public void Meow()
{
Console.WriteLine($"{Name}正在喵喵叫。");
}
}
class Program
{
static void Main()
{
// 創建一個 Dog 物件
Dog myDog = new Dog("小白", 3, "拉布拉多");
myDog.Eat();
myDog.Bark();
// 創建一個 Cat 物件
Cat myCat = new Cat("咪咪", 2, "橘貓");
myCat.Sleep();
myCat.Meow();
}
}
多型(Polymorphism)
多型也叫同名異式,即使用一個方法名稱,在不同的條件下可以執行不同的動作
以下就是一例
using System;
// 基類 Shape
class Shape
{
public virtual void Draw()
{
Console.WriteLine("繪製一個形狀");
}
}
// 派生類 Circle
class Circle : Shape
{
public override void Draw()
{
Console.WriteLine("繪製一個圓形");
}
}
// 派生類 Rectangle
class Rectangle : Shape
{
public override void Draw()
{
Console.WriteLine("繪製一個矩形");
}
}
class Program
{
static void Main()
{
Shape[] shapes = new Shape[]
{
new Circle(),
new Rectangle()
};
foreach (Shape shape in shapes)
{
shape.Draw();
}
}
}
多載(Overloading):多個方法擁有相同名稱,不同參數,傳入不同參數時,會執行對應的方法
這個比較常見,比方說以下的Add方法,在傳入不同參數,或許是2參數、3個參數的時候會執行對應的方法:
using System;
class Calculator
{
// 加法方法,接受兩個整數參數
public int Add(int a, int b)
{
return a + b;
}
// 加法方法,接受兩個浮點數參數
public double Add(double a, double b)
{
return a + b;
}
// 加法方法,接受三個整數參數
public int Add(int a, int b, int c)
{
return a + b + c;
}
}
class Program
{
static void Main()
{
Calculator calculator = new Calculator();
int result1 = calculator.Add(5, 3);
double result2 = calculator.Add(2.5, 3.7);
int result3 = calculator.Add(1, 2, 3);
Console.WriteLine($"結果1: {result1}");
Console.WriteLine($"結果2: {result2}");
Console.WriteLine($"結果3: {result3}");
}
}