문제
내 질문이 꽤 멍청하다고 생각합니다. 문제가 너무 오래 머무르면 시력이 좁아지고 좁아집니다> <. 게다가 나는 상속, 다형성 등에 충분하지 않습니다.
아이디어는 다음과 같습니다. 파생 클래스의 여러 목록이 있으며 해당 목록에서 일반 기능을 호출하고 싶습니다 (기본 클래스의 구성 및 수정). 나는 상속 재산과 관련이 있다고 생각하지만 지금은 내가 원하는대로 작동하게하지 않습니다.
다음은 내가하고자하는 일에 대한 매우 간단한 예입니다.
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 제약 조건을 추가하고 있습니다.