데이터베이스의 서로 다른 테이블에 매핑되는 약 12 개의 다르지만 매우 유사한 개체를 사용하여 동일한 작업을 수행하는 기능을 제공해야하는 상황에 처했습니다. 그래서 상속과 제네릭을 모두 다룰 수있는 좋은 기회라고 생각했습니다.
나는 Grandparent
-> Parent
-> Child
관계가 있고 Child
를 기대하는 함수 에 전달할 수 있어야 Grandparent
하는 문제에 봉착했습니다. 제네릭을 사용하지 않는 경우 잘 작동합니다. 내가 얻는 오류는 다음과 같습니다.
'
ChildA
'인수 유형은 매개 변수 유형 'GrandparentA<ParentB,ParentC>
'에 할당 할 수 없습니다.
아래는 내가 시도한 것의 매우 단순화 된 버전이지만 여전히 동일한 오류가 발생합니다.
void Main()
{
var child = new ChildA();
DoSomething(child);
}
public void DoSomething(GrandParentA<ParentB, ParentC> Data) { }
public abstract class GrandParentA<T1, T2>
where T1 : ParentB
where T2 : ParentC
{
public abstract T1 Foo { get; set; }
public abstract T2 Bar { get; set; }
}
public abstract class ParentA<T> : GrandParentA<ChildB, T>
where T : ParentC
{
public override abstract ChildB Foo { get; set; }
public override abstract T Bar { get; set; }
}
public class ChildA : ParentA<ChildC>
{
public override ChildB Foo { get; set; }
public override ChildC Bar { get; set; }
}
public abstract class ParentB { }
public class ChildB : ParentB { }
public abstract class ParentC { }
public class ChildC : ParentC { }
에 대한 호출과 함께 발생하는 컴파일러 오류 DoSomething(child)
는에 대한 모든 것이 child
조부모가 가지고있는 것에 업 캐스트 될 수 있기 때문에 작동 할 것이라고 생각 했습니다. 혼동 할 다운 캐스팅이 없습니다 (올바른 방법으로 업 / 다운을 받았다고 생각합니다! ?) 내가 어디로 잘못 가고 있습니까?
클래스는 변하지 GrandParentA<ParentB, ParentC>
않으므로에서 할당 할 수 없습니다 GrandParentA<ChildB, ChildC>
. 따라서 DoSomething
메소드를 제네릭 으로 만들어야 하므로 GrandParentA
모든 제네릭 매개 변수를 사용할 수 있습니다 .
public void DoSomething<T1, T2>(GrandParentA<T1, T2> Data)
where T1 : ParentB
where T2 : ParentC
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다