> 백엔드 개발 > C++ > C#에서 개방형 제네릭 형식을 사용하여 다형성을 어떻게 달성할 수 있나요?

C#에서 개방형 제네릭 형식을 사용하여 다형성을 어떻게 달성할 수 있나요?

Mary-Kate Olsen
풀어 주다: 2025-01-11 06:46:41
원래의
205명이 탐색했습니다.

How Can I Achieve Polymorphism with Open Generic Types in C#?

C#에서 개방형 제네릭 유형을 사용한 다형성

일반 코드를 다룰 때 일반적으로 다양한 유형의 데이터를 조작해야 하는 시나리오에 직면하게 됩니다. 그러나 C#의 제네릭 다형성에는 개방형 제네릭 형식을 처리하는 데 한계가 있습니다.

질문

다음 코드를 고려하세요.

<code class="language-csharp">public abstract class Data<T>
{
}

public class StringData : Data<string>
{
}

public class DecimalData : Data<decimal>
{
}

List<Data<T>> dataCollection = new List<Data<T>>(); // 错误:缺少类型参数

dataCollection.Add(new DecimalData());
dataCollection.Add(new StringData());</code>
로그인 후 복사

이 예에서는 다양한 데이터 하위 유형의 인스턴스를 보유할 수 있는 목록을 생성하려고 합니다. 그러나 개방형 일반 유형(예: 데이터)에는 유형 매개변수를 지정해야 하기 때문에 마지막 줄은 컴파일러 오류로 인해 실패합니다.

솔루션

C#은 개방형 일반 유형에 대한 진정한 다형성을 지원하지 않습니다. 이 문제를 극복하기 위한 몇 가지 옵션이 있습니다:

  1. 개체 목록 만들기:

    <code class="language-csharp"> List<object> dataCollection = new List<object>();
    
     dataCollection.Add(new DecimalData());
     dataCollection.Add(new StringData());</code>
    로그인 후 복사

    그러나 이 접근 방식은 유형 안전성을 상실하며 데이터에 액세스할 때 명시적인 변환이 필요합니다.

  2. 제네릭이 아닌 인터페이스 또는 추상 클래스 사용:

    <code class="language-csharp"> public interface IData
     {
         void SomeMethod();
     }
    
     public abstract class Data<T> : IData
     {
         public void SomeMethod()
         {
         }
     }
    
     List<IData> dataCollection = new List<IData>();
    
     dataCollection.Add(new DecimalData());
     dataCollection.Add(new StringData());</code>
    로그인 후 복사

    일부 일반성과 유형 안전성을 희생하면서 목록 요소에 대한 비제네릭 작업을 허용합니다.

C#에서 개방형 제네릭 형식을 사용할 때의 제한 사항과 장단점을 이해하고 특정 요구 사항에 가장 적합한 솔루션을 선택하는 것이 중요합니다.

위 내용은 C#에서 개방형 제네릭 형식을 사용하여 다형성을 어떻게 달성할 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿