C# 物件導向程式設計(Object-Oriented Programming, OOP)介紹

物件導向程式設計(Object-Oriented Programming, OOP)是一種以「物件」為核心的程式設計方式。在OOP中,程式被設計成由多個物件組成,而每個物件都是類別(class)的實例(instance)。類別定義了物件的屬性(properties)和行為(methods),而物件則是類別的具體實現。

OOP的四大核心概念:

封裝(Encapsulation)將資料和方法封裝在類別中,對外部隱藏內部實現,只暴露必要的接口。這可以保護資料不被外部直接修改。
繼承(Inheritance)允許一個類別從另一個類別繼承屬性和方法,讓子類別(derived class)可以重用父類別(base class)的程式碼,並在此基礎上擴展或修改功能。
多型(Polymorphism)允許不同的類別以相同的接口呼叫相同的方法,實現不同的行為。這通常通過方法覆寫(override)或介面(interface)來達成。
抽象(Abstraction)透過介面或抽象類別來定義類別的行為,而不關注具體的實現細節。這可以讓程式設計更加靈活和可擴展。

 

1. 封裝(Encapsulation)

public class Account
{
    // 封裝資料,使用 private 保護變數
    private decimal balance;

    // 透過公開的方法來操作資料
    public void Deposit(decimal amount)
    {
        if (amount > 0)
        {
            balance += amount;
        }
    }

    public void Withdraw(decimal amount)
    {
        if (amount > 0 && amount <= balance)
        {
            balance -= amount;
        }
    }

    public decimal GetBalance()
    {
        return balance;
    }
}

 

2. 繼承(Inheritance)

// 基礎類別
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.");
    }
}

 

3. 多型(Polymorphism)

基底:提供了一個共同的方法或屬性,可以被多個不同的類別繼承或實現。

覆寫:子類別可以根據需求,覆寫基底類別的方法,以達到多型的效果。

public class Animal
{
    public virtual void Speak()
    {
        Console.WriteLine("The animal makes a sound.");
    }
}

public class Dog : Animal
{
    public override void Speak()
    {
        Console.WriteLine("The dog barks.");
    }
}

public class Cat : Animal
{
    public override void Speak()
    {
        Console.WriteLine("The cat meows.");
    }
}

 

4. 抽象(Abstraction)

抽象更像是「合約」,它強制子類別或實現該介面的類別必須實作特定的方法或屬性。抽象類別或介面本身不提供具體實現,而是定義了一個通用的框架,讓子類別決定如何實作。

抽象類別:可以包含抽象方法(無實作)和具體方法(有實作)。子類別必須實作所有抽象方法。

介面:完全由抽象方法組成,沒有任何具體實作。實現介面的類別必須實作所有方法。

// 抽象類別
public abstract class Shape
{
    // 抽象方法,必須由子類別實現
    public abstract double GetArea();

    public void Describe()
    {
        Console.WriteLine($"This shape has an area of {GetArea()} square units.");
    }
}

// 子類別實現抽象方法
public class Circle : Shape
{
    public double Radius { get; set; }

    public override double GetArea()
    {
        return Math.PI * Radius * Radius;
    }
}

public class Rectangle : Shape
{
    public double Width { get; set; }
    public double Height { get; set; }

    public override double GetArea()
    {
        return Width * Height;
    }
}

Copyright © 2025 - All right reserved