문제

내 질문이 꽤 멍청하다고 생각합니다. 문제가 너무 오래 머무르면 시력이 좁아지고 좁아집니다> <. 게다가 나는 상속, 다형성 등에 충분하지 않습니다.

아이디어는 다음과 같습니다. 파생 클래스의 여러 목록이 있으며 해당 목록에서 일반 기능을 호출하고 싶습니다 (기본 클래스의 구성 및 수정). 나는 상속 재산과 관련이 있다고 생각하지만 지금은 내가 원하는대로 작동하게하지 않습니다.

다음은 내가하고자하는 일에 대한 매우 간단한 예입니다.

class Baseclass
{
    public int ID;
    public string Name;
}
class DerivedClass1 : Baseclass
{
}

private void FuncOnBase(List<Baseclass> _collection)
{
    // ...

    foreach (Baseclass obj in _collection)
    {
        ++obj.ID;
    }

    // ...
}
private void FuncTest()
{
    List<DerivedClass1> collection1 = new List<DerivedClass1>();
    collection1.Add(new DerivedClass1() { ID = 1 });
    collection1.Add(new DerivedClass1() { ID = 2 });
    collection1.Add(new DerivedClass1() { ID = 3 });

    FuncOnBase(collection1);   //  ==> forbidden, cannot convert the derived class list to the base class list
}
도움이 되었습니까?

해결책

차이를 사랑해야합니다. ㅏ List<DerivedClass1> ~이다 ~ 아니다List<Baseclass> - 그렇지 않으면, FuncOnBase 추가하려고 시도 할 수 있습니다 Baseclass 목록에, 컴파일러는 그것을 발견하지 못할 것입니다.

한 가지 요령은 일반적인 방법을 사용하는 것입니다.

private void FuncOnBase<T>(List<T> _collection) where T : Baseclass
{
    // ...

    foreach (T obj in _collection)
    {
        obj.ID++;
    }

    // ...
}

위에서 제시 한 예제와 관련하여 - 우리는 추가 할 수 있습니다. T 목록에; 특히 우리가 추가하는 경우 유용합니다 T : new() 제약 또는 통과 (예 : a) params T[].

또한 주목하십시오 IEnumerable<T> C# 4.0 / .NET 4.0에서 공분산이됩니다. IEnumerable<Baseclass> (목록 대신) "그대로"작동합니다.

private void FuncOnBase(IEnumerable<Baseclass> _collection)
{
   ///...
}

다른 팁

당신이 만하고 있다면 foreach, 선언하다 FuncOnBase(IEnumerable<Baseclass> collection), 당신이 전화 할 수 있습니다 FuncTest 이와 같이:

FuncOnBase(collection1.Cast<Baseclass>());

메소드를 선언 할 때 List<T> 매개 변수이지만 그것의 단지 사용합니다 IEnumerable<T> 기능, 코드에 아무 의미가없는 API 제약 조건을 추가하고 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top