Rumah >pembangunan bahagian belakang >C++ >Bagaimanakah Saya Boleh Mencapai Kovarian dengan Sokongan Indeks dalam Koleksi?

Bagaimanakah Saya Boleh Mencapai Kovarian dengan Sokongan Indeks dalam Koleksi?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-28 19:04:15156semak imbas

How Can I Achieve Covariance with Index Support in Collections?

Kovarian dalam Koleksi dengan Sokongan Indeks

Kovarian dalam koleksi membolehkan item terbitan disimpan dalam koleksi yang diisytiharkan untuk jenis asas. Walau bagaimanapun, koleksi kovarian lalai, IEnumerable, tidak mempunyai sokongan indeks.

Seperti nota penanya, menyiarkan Senarai kepada IList boleh membenarkan penambahan haiwan bukan Anjing, yang tidak dibenarkan dalam Senarai asal koleksi.

Mungkin Penyelesaian

Dari .NET 4.5 dan seterusnya, IReadOnlyList dan IReadOnlyCollection menawarkan kedua-dua tingkah laku kovarian dan carian indeks. Walau bagaimanapun, ia adalah baca sahaja.

Mencipta Pembalut Kovarian

Jika koleksi boleh tulis dengan sokongan indeks diperlukan, kaedah sambungan boleh dibuat untuk membalut IList< ;T> dan dedahkan hanya subset kaedah yang memberikan kovarians yang diingini:

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>
    {
        // Implementation...
    }
}

Kelas pembalut ini, CovariantList, melaksanakan IIndexedEnumerable, yang menyediakan pengindeks dan harta kira.

Dengan memanggil AsCovariant() pada IList, anda boleh mendapatkan koleksi kovarian dengan sokongan indeks, membolehkan anda mendapatkan semula dan mengulangi item terbitan sambil mengekalkan jenis asas yang ditentukan.

Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Mencapai Kovarian dengan Sokongan Indeks dalam Koleksi?. 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