간단히 말해, 사용 된 모든 유형에 상위 유형을 사용하여 배열에 다른 유형 매개 변수를 사용하여 제네릭을 저장하고 싶습니다. MSDN은 제네릭이 불변 타입이기 때문에 불가능하다고 언급했지만, 4.0 프레임 워크 이후로 변경되었다고하는 의견도 있습니다. 다른 제네릭 배열
Cannot implicitly convert type
'InheritanceTest.Program.MyGeneric<InheritanceTest.Program.Dog>' to
'InheritanceTest.Program.MyGeneric<InheritanceTest.Program.Animal>'
Cannot implicitly convert type
'InheritanceTest.Program.MyInheritedGeneric<InheritanceTest.Program.Cat>'
to 'InheritanceTest.Program.MyGeneric<InheritanceTest.Program.Animal>'
부모를 사용하여 배열에 제네릭을 저장할 수있는 방법이 있나요 : 이것은 유사한 오류를 반환
public class Animal
{
}
public class Dog : Animal
{
}
public class Cat : Animal
{
}
public class MyGeneric<T>
{ }
public class MyInheritedGeneric<T> : MyGeneric<T>
{ }
static void Main(string[] args)
{
MyGeneric<Animal>[] myGenericArray = new MyGeneric<Animal>[]
{
new MyGeneric<Dog>(),
new MyInheritedGeneric<Cat>()
};
}
: 여기
는 내가하고 싶은 것이 기본적인 예입니다 유형의 종류, 또는 이것은 단순히 불가능합니까? 나는 그것이 가능하다는 것을 정말로 희망한다. 그렇지 않으면 내 프로그램이 악몽이 될 것이다 ...편집 : 좀 더 문맥!
게임에서 적을 생성하는 수업을 만들고 있습니다. 저는 그것들을 Templates라고 부릅니다. (실제 템플릿 클래스와는 관계가 없으며, 청사진이나 공장이라고도 할 수 있습니다.) 적 생성자는 자신의 값을 결정할 때 사용하는 템플릿을 사용합니다. 게임이로드되면 템플릿은 생성하도록 할당 된 해당 유형의 배열을 반환하는 Generate() 함수를 사용하여 모든 적을 생성하는 데 사용됩니다. 템플릿으로 생성되는 모든 객체는 템플릿을 유일한 매개 변수로 사용하는 생성자를 가져야합니다.
public class Template<T>
{
protected static Random random = new Random();
protected int _amount;
public int Amount
{
get { return _amount; }
}
public virtual T CreateInstance()
{
return (T)Activator.CreateInstance(typeof(T), this);
}
public virtual T[] Generate()
{
T[] objects = new T[Amount];
for (int i = 0; i < Amount; ++i)
objects[i] = CreateInstance();
return objects;
}
}
다음은 실제 적군 클래스와 템플릿이 포함 된 BasicZombie.cs 파일의 요약입니다.
class Tpl_BasicZombie : Tpl_Enemy<BasicZombie>
{
public Tpl_BasicZombie()
{
_hp = 4;
_speed = 3;
_amount = 10;
}
}
class BasicZombie : GroundEnemy
{
public BasicZombie(Tpl_BasicZombie template)
: base(template, TextureManager.Get("zombie_base"), 1, 8)
{ }
public void StuffHappens()
{ }
}
게임을로드 할 때 배열의 모든 템플릿을 통해 적을로드하고 싶습니다. 이 작업을 수동으로 수행 할 수 있음을 알고 있지만, 새로운 유형의 적을 생성 할 때마다 수동으로 코드에 추가해야합니다 (따라서 한 번 이상 잊어 버릴 수도 있음).
내 두 옵션은 다음과 같습니다. 1- 일반을 사용하면 위의 문제가 발생합니다. 2 제네릭을 사용하지 않고 내부에 형식을 저장합니다.이 형식은 반환 형식 인 Generate() 함수를 고정합니다. 이것은 generate 함수가 객체의 배열을 출력 함을 의미합니다.이 배열은 템플릿이 적의 배열을 생성 할 때마다 적절한 유형으로 변환해야합니다.
나는이 모든 것에 우아한 해결책이 있다는 것을 알 수있는 공간이 내 머리 속에 있습니다.
[공분산 및 반항 FAQ] (http://blogs.msdn.com/b/csharpfaq/archive/2010/02/16/covariance-and-contravariance-faq.aspx?Redirected=true)를 이미 읽었습니까?)? – 48klocs
나는 그렇지 않다. 나는 한 번 해봤는데 매우 유용했습니다! 이전에이 키워드를 알고 싶었습니다. 공분산을위한 인터페이스를 사용하는 것이 좋습니다. –