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

C# 介面隱藏實作與 ReadOnlyDictionary 設計模式

     編輯:關於C語言

為何要隱藏介面成員?

介面定義契約,但有時契約「太寬」。例如 ICollection<T> 包含 Add/Remove/Clear,若要實作唯讀集合,這些方法會破壞語意。解決方案:顯式介面實作隱藏不想公開的成員,並在該成員中拋出 NotSupportedException。

顯式介面實作語法

public interface IFoo { void Foo(); }

public class Implement : IFoo
{
    // 顯式實作:只能透過 IFoo 介面呼叫
    void IFoo.Foo() { /* 實作 */ }
}

public class Program
{
    static void Main()
    {
        var impl = new Implement();
        // impl.Foo(); // 編譯錯誤:顯式實作成員不可直接呼叫
        IFoo foo = (IFoo)impl;
        foo.Foo(); // OK
    }
}

實作 ReadOnlyCollection<T> 範例

public class ReadOnlyCollection<T> : ICollection<T>
{
    private readonly ICollection<T> _inner;

    public ReadOnlyCollection(ICollection<T> collection)
    {
        _inner = collection ?? throw new ArgumentNullException(nameof(collection));
    }

    // 安全成員:直接委派
    public int Count => _inner.Count;
    public bool IsReadOnly => true;
    public bool Contains(T item) => _inner.Contains(item);
    public void CopyTo(T[] array, int index) => _inner.CopyTo(array, index);
    public IEnumerator<T> GetEnumerator() => _inner.GetEnumerator();
    IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();

    // 破壞唯讀語意的成員:顯式實作 + 拋出例外
    void ICollection<T>.Add(T item) => throw new NotSupportedException("集合為唯讀。");
    void ICollection<T>.Clear() => throw new NotSupportedException("集合為唯讀。");
    bool ICollection<T>.Remove(T item) => throw new NotSupportedException("集合為唯讀。");
}

設計要點總結

  1. 以包裝 (Wrapper) 模式持有內部集合,而非繼承。
  2. 2. 安全成員 隱式實作 (公開於類別表面)。 3. 破壞不變條件的成員 顯式實作 (隱藏於類別表面) + NotSupportedException。 4. 即使呼叫端強制轉型為介面,執行時仍會失敗,確保語意正確性。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved