首頁 >後端開發 >C++ >如何透過 .NET 集合中的索引存取實現協變行為?

如何透過 .NET 集合中的索引存取實現協變行為?

Barbara Streisand
Barbara Streisand原創
2024-12-30 10:43:10373瀏覽

How Can I Achieve Covariant Behavior with Indexed Access in .NET Collections?

理解協方差和IList 限制

協方差是程式設計中的一個原則,其中引用類型可以分配給基類或介面的變數類型。然而,當涉及集合時,特別是當我們考慮 IList 介面時,這會帶來一個困境。

IList 表示具有索引存取的集合,允許我們透過索引檢索元素。不幸的是,像 List 這樣的內建 .NET 集合無法實現。同時實作 get 和 set 索引器,這會阻止它們完全協變。

具有索引存取的協變集合的解決方案

儘管存在此限制,但仍有一些方法可以實現協變行為,同時保持索引存取。

1. ReadOnlyCollections(從.NET 4.5 開始)

IReadOnlyList;和IReadOnlyCollection是.NET 4.5 中引入的協變介面。它們只有一個 get 索引器,這使得它們適合協變場景。列表和 ReadOnlyCollection實作這兩個介面。

2.自訂包裝器

如果您需要在早期版本的 .NET 中具有索引存取的協變集合,您可以建立包裝器類別。包裝類別將封裝 IList 。並且僅公開 get 索引器和 IEnumerable

以下程式碼示範了一個名為 CovariantList 的自訂包裝類別。提供 IList 的協變存取:

public static class Covariance
{
    public static IIndexedEnumerable<T> AsCovariant<T>(this IList<T> tail)
    {
        return new CovariantList<T>(tail);
    }

    private class CovariantList<T> : IIndexedEnumerable<T>
    {
        private readonly IList<T> tail;

        public CovariantList(IList<T> tail)
        {
            this.tail = tail;
        }

        public T this[int index] { get { return tail[index]; } }
        public IEnumerator<T> GetEnumerator() { return tail.GetEnumerator();}
        IEnumerator IEnumerable.GetEnumerator() { return tail.GetEnumerator(); }
        public int Count { get { return tail.Count; } }
    }
}

public interface IIndexedEnumerable<out T> : IEnumerable<T>
{
    T this[int index] { get; }
    int Count { get; }
}

以上是如何透過 .NET 集合中的索引存取實現協變行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn