首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 成員存取控制、屬性封裝與抽象類別介面實作完整教學

     編輯:關於C語言

一、成員存取層級實戰:private 的嚴格隔離

private 成員僅在宣告類別內部可見,衍生類別與外部程式碼均無法存取。編譯器會在嘗試跨越邊界時產生錯誤:


class Per
{
    private string _name; // 僅本類別可存取
    public string Address;
    public int Age { get; set; } // 自動實作屬性
}

Per p = new Per();
// p._name = "Test"; // 編譯錯誤:'Per._name' 因保護層級而無法存取
p.Address = "Taipei"; // 合法
p.Age = 22; // 呼叫 set 存取器

private存取錯誤示意

二、屬性 get/set:封裝的標準化入口

1. 完整屬性語法


class Per
{
    private int _age;
    public int Age
    {
        get { return _age; }
        set
        {
            if (value < 0 || value > 150) throw new ArgumentOutOfRangeException();
            _age = value;
        }
    }
}

2. 自動實作屬性


public int Age { get; set; } // 編譯器自動產生隱私備份欄位
public int Age { get; private set; } // 唯讀對外,內部可寫

3. 屬性優勢

  • 驗證、轉換、記錄、延遲載入等邏輯集中於存取器
  • 二進位相容:未來擴充邏輯不需修改呼叫端
  • 介面只能定義屬性,不能定義欄位
  • 資料繫結、序列化、OR Mapping 皆仰賴屬性

屬性存取器示意

三、抽象類別與抽象方法:定義契約強制實作

1. 核心規則

  • abstract class:不可實例化,可包含抽象與非抽象成員
  • abstract method:無主體,衍生類必須以 override 實作
  • 抽象類別可定義建構函式(供衍生類呼叫)

2. 範例:抽象類別 Myab 與實作類別 SubMyab


public abstract class Myab
{
    public abstract void Hi(string Name); // 無主體,分號結尾
}

public class SubMyab : Myab
{
    public override void Hi(string Name)
    {
        Console.WriteLine($"{Name} override void Hi(string Name)");
    }
}

// 使用
SubMyab obj = new SubMyab();
obj.Hi("Test");

四、介面 vs 抽象類別:關鍵差異與選擇指南

維度介面抽象類別
成員類型全部隱含 public abstract(C# 8 前)可包含任何存取層級、具體實作、欄位、建構函式
多重實作類別可實作多個介面單一繼承
版本演進C# 8+ 支援預設實作新增非抽象成員不破壞衍生類
適用場景定義「能做什麼」契約(如 IDisposable)定義「是什麼」共享實作骨架

五、介面實作完整範例:多型計算幾何面積


public interface IShape
{
    double GetArea();
}

// 矩形
public class Rectangle : IShape
{
    public double Width, Height;
    public Rectangle(double w, double h) { Width = w; Height = h; }
    public double GetArea() => Width * Height;
}

// 圓形
public class Circle : IShape
{
    public double Radius;
    public Circle(double r) { Radius = r; }
    public double GetArea() => Math.PI * Radius * Radius;
}

// 三角形(海龍公式簡化版)
public class Triangle : IShape
{
    public double A, B, C;
    public Triangle(double a, double b, double c) { A = a; B = b; C = c; }
    public double GetArea() => A * B * C; // 示意用,實際應用海龍公式
}

// 統一處理
var shapes = new List
{
    new Rectangle(2, 8),
    new Triangle(5, 1, 9),
    new Circle(10)
};

foreach (var s in shapes)
    Console.WriteLine($"面積: {s.GetArea():F2}");

介面多型執行結果

總結

private 強制封裝邊界,屬性提供受控存取入口,抽象類別共享實作骨架並強制關鍵行為,介面定義純粹契約支援多重實作。四者結合構成 C# 物件導向設計的四大基石,掌握其適用時機與組合方式,能建構出高內聚、低耦合、易測試、可演進的軟體架構。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved