>백엔드 개발 >C++ >.NET 컬렉션에서 인덱스 액세스로 공분산을 달성하려면 어떻게 해야 합니까?

.NET 컬렉션에서 인덱스 액세스로 공분산을 달성하려면 어떻게 해야 합니까?

Patricia Arquette
Patricia Arquette원래의
2024-12-28 12:51:24174검색

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

.NET에서 인덱스 액세스 지원으로 공분산을 활용하면

공분산을 통해 프로그래머는 명시적인 유형 캐스팅 없이 파생 클래스를 기본 클래스로 처리할 수 있습니다. 그러나 .NET에서는 인덱스 액세스 지원이 부족한 공변 컬렉션에 제한이 있습니다. 이 문제는 특정 유형의 컬렉션(예: Dog 개체를 포함하는 목록)을 기본 유형(예: Animal)의 컬렉션으로 변환하려고 할 때 발생합니다.

기본 문제 이해

문제는 List가 Add 메서드로 구성된 ICollection을 구현한다는 사실에서 발생합니다. 동물 기반 IList로 업캐스팅하면 모든 유형의 동물을 무분별하게 추가할 수 있으며 원래 컬렉션의 유형 제약 조건을 위반합니다.

색인 지원이 포함된 공변 컬렉션

.NET 4.5 및 나중에:

  • IReadOnlyListIReadOnlyCollection은 모두 공변적입니다.
  • List 이러한 인터페이스를 구현하여 공분산 원칙을 위반하지 않고 요소를 검색할 수 있는 get-only 인덱서를 제공합니다.

이전 .NET 버전의 경우:

  • 공분산 인덱스 지원은 이전 .NET에서는 기본적으로 사용할 수 없습니다.
  • 사용자 정의 래퍼 접근 방식: 한 가지 솔루션은 IEnumerable 및 get 인덱서 인터페이스만 노출하는 사용자 정의 클래스에 원본 컬렉션을 래핑하는 것입니다. 이 접근 방식은 인덱스 액세스 기능을 유지하면서 공분산을 보장합니다.

구현:

다음 C# 코드는 공분산 확장 방법을 사용하는 사용자 지정 래퍼 접근 방식을 보여줍니다.

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; }
}

이 확장 방법을 사용하면 다음에서 볼 수 있듯이 인덱스 지원을 통해 공변 컬렉션을 생성할 수 있습니다. 다음 예:

List<Dog> dogs = new List<Dog>();

IIndexedEnumerable<Animal> animals = dogs.AsCovariant();

위 내용은 .NET 컬렉션에서 인덱스 액세스로 공분산을 달성하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.