Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencapai Gelagat Kovarian dengan Akses Berindeks dalam Koleksi .NET?

Bagaimanakah Saya Boleh Mencapai Gelagat Kovarian dengan Akses Berindeks dalam Koleksi .NET?

Barbara Streisand
Barbara Streisandasal
2024-12-30 10:43:10368semak imbas

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

Memahami Kovarian dan Had IList

Kovarian ialah prinsip dalam pengaturcaraan di mana jenis rujukan boleh diberikan kepada pembolehubah asas atau antara muka taip. Walau bagaimanapun, ini menimbulkan dilema apabila ia melibatkan koleksi, khususnya apabila kami mempertimbangkan antara muka IList.

IList mewakili koleksi dengan akses diindeks, membolehkan kami mendapatkan semula elemen mengikut indeksnya. Malangnya, koleksi .NET terbina dalam seperti List laksanakan kedua-dua pengindeks get dan set, yang menghalang mereka daripada menjadi kovarian sepenuhnya.

Penyelesaian untuk Koleksi Kovarian dengan Akses Berindeks

Walaupun pengehadan ini, terdapat cara untuk mencapai tingkah laku kovarian sambil mengekalkan akses diindeks.

1. ReadOnlyCollections (Daripada .NET 4.5 Dan Seterusnya)

IReadOnlyList dan IReadOnlyCollection ialah antara muka kovarian yang diperkenalkan dalam .NET 4.5. Mereka hanya mempunyai pengindeks dapatkan, menjadikannya sesuai untuk senario kovarian. Senaraikan dan ReadOnlyCollection laksanakan kedua-dua antara muka.

2. Pembungkus Tersuai

Jika anda memerlukan koleksi kovarian dengan akses diindeks dalam versi terdahulu .NET, anda boleh membuat kelas pembungkus. Kelas pembalut akan merangkum IList dan hanya mendedahkan get indexer dan IEnumerable antara muka.

Kod berikut menunjukkan kelas pembalut tersuai bernama CovariantList yang menyediakan akses kovarian kepada 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; }
}

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Gelagat Kovarian dengan Akses Berindeks dalam Koleksi .NET?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn