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

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

Patricia Arquette
Lepaskan: 2024-12-28 12:51:24
asal
164 orang telah melayarinya

How Can I Achieve Covariance with Index Access in .NET Collections?

Memanfaatkan Kovarian dengan Sokongan Akses Indeks dalam .NET

Kovarian membolehkan pengaturcara untuk menganggap kelas terbitan sebagai kelas asas mereka tanpa pemutus jenis eksplisit. Walau bagaimanapun, dalam .NET, terdapat had dengan koleksi kovarian yang tidak mempunyai sokongan akses indeks. Isu ini timbul apabila cuba menukar koleksi jenis tertentu (cth., Senarai yang memegang objek Anjing) kepada koleksi jenis asasnya (cth., Haiwan).

Memahami Isu Asas

Masalahnya berpunca daripada fakta bahawa List melaksanakan ICollection, yang terdiri daripada kaedah Tambah. Upcasting kepada IList berasaskan haiwan akan membenarkan penambahan sembarangan mana-mana jenis haiwan, melanggar kekangan jenis koleksi asal.

Koleksi Kovarian dengan Sokongan Indeks

Dalam .NET 4.5 dan kemudian:

  • IReadOnlyList dan IReadOnlyCollection kedua-duanya adalah kovarian.
  • L&t< ; dan ReadOnlyCollection laksanakan antara muka ini, menyediakan pengindeks dapatkan sahaja yang mampu mendapatkan semula elemen tanpa melanggar prinsip kovarians.

Untuk Versi .NET Terdahulu:

    Kovarians dengan sokongan indeks tidak tersedia secara asli dalam .NET yang lebih awal versi.
  • Pendekatan Pembungkus Tersuai: Satu penyelesaian melibatkan pembungkusan koleksi asal dalam kelas tersuai yang mendedahkan hanya IEnumerable dan dapatkan antara muka pengindeks. Pendekatan ini memastikan kovarians sambil mengekalkan kefungsian akses indeks.

Pelaksanaan:

Kod C# berikut menunjukkan pendekatan pembalut tersuai menggunakan kaedah sambungan Kovarian:

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; }
}
Salin selepas log masuk
Kaedah sambungan ini membolehkan anda mencipta koleksi kovarian dengan sokongan indeks, seperti yang dilihat dalam yang berikut contoh:

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

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan