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

C# 程式設計利器之三:介面設計與回呼模式實戰

     編輯:關於C#

C# 介面深度解析:定義、實作、繼承、特性與回呼模式

介面是「面向介面程式設計」核心,定義契約而非實作。本文系統說明介面語法、屬性/事件定義、多重繼承、與抽象類別比較、回呼模式實戰。

一、介面定義:只簽名不實作

/// 
/// 玩遊戲介面
/// 
public interface IPlayer
{
    ///  取得玩家名稱 
    string GetName();

    ///  由 Player 決定出什麼手勢 
    string Show();
}

二、介面定義屬性、索引子、事件

介面中屬性只有 get; set; 存取子,無實作主體。

///  定義介面,包含 Name 屬性 
public interface IAttribute
{
    string Name { get; set; }
}

///  實作介面屬性 
public class Component : IAttribute
{
    public string Name
    {
        get { return "張三"; }
        set { this.Name = value; }
    }
}

三、介面實作:剪刀石頭布遊戲案例

1. 封裝手勢常數

public class Options
{
    public static readonly string JIANDAO = "剪刀";
    public static readonly string SHITOU = "石頭";
    public static readonly string BU = "布";
}
亦可用列舉或結構封裝固定狀態,參考《C# 程式設計利器之二:結構與列舉》。

2. 爺爺類別:隨機出拳

public class Grandpa : IPlayer
{
    public string GetName() { return "爺爺"; }

    public string Show()
    {
        Random random = new Random();
        int i = (int)(random.Next() * 1000) % 3;
        switch (i)
        {
            case 0: return Options.JIANDAO;
            case 1: return Options.SHITOU;
            default: return Options.BU;
        }
    }
}

3. 孫子類別:固定出剪刀

public class Grandson : IPlayer
{
    public string GetName() { return "孫子"; }
    public string Show() { return Options.JIANDAO; }
}

介面實作類別圖

四、介面繼承:多重介面合併

interface IA { }
interface IB : IA { }
interface IC : IA, IB { }
interface ID : IA, IB, IC { }

一個介面可繼承多個基底介面;實作類別需實作所有成員。

五、介面特性總覽

  • 成員隱含 public,不可加存取修飾詞。
  • 可包含:方法、屬性、索引子、事件。
  • 不可包含:常數、欄位、建構子、解構子、靜態成員。
  • 類別可實作多個介面,但只能繼承單一類別(含抽象類別)。
  • 介面是參考型別。

六、介面與抽象類別比較

特性介面抽象類別
可否實例化否否
未實作成員所有成員抽象方法
派生類責任實作所有成員實作抽象方法
多重繼承支援單一繼承
預設實作C# 8.0+ default 方法可有虛擬/非虛擬方法

七、介面回呼模式實戰

場景:延遲調用物件方法,於特定條件滿足時觸發。

using System;
using System.Collections.Generic;
using System.Text;

namespace CallBack
{
    class Program
    {
        static void Main(string[] args)
        {
            // 建立控制器,注入回呼物件
            Resolve resolve = new Resolve(new PlayBasketball());
            resolve.Play();

            resolve = new Resolve(new PlayFootball());
            resolve.Play();
        }
    }

    // 回呼介面
    public interface IPlayer
    {
        void Play();
    }

    // 具體回呼:籃球
    public class PlayBasketball : IPlayer
    {
        public void Play() { Console.WriteLine("玩籃球"); }
    }

    // 具體回呼:足球
    public class PlayFootball : IPlayer
    {
        public void Play() { Console.WriteLine("玩足球"); }
    }

    // 控制器:持有介面參考
    public class Resolve
    {
        private IPlayer player;
        public Resolve(IPlayer player) { this.player = player; }

        public void Play() { player.Play(); }
    }
}

八、總結

  • 介面定義「能做什麼」,類別實作「怎麼做」。
  • 依賴介面而非具體類別,實現鬆散耦合、易測試、可擴充。
  • 回呼模式透過介面注入,分離控制流程與具體行為。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved