컨텍스트 : .NET 4.0, C#C# 제네릭 및 인터페이스 구현 사용
일부 서비스를 제공하기 위해이를 구현하는 일련의 인터페이스와 클론 집합을 만들고 있습니다. 클라이언트는 구체적인 클립을 사용하지만 인터페이스를 매개 변수 유형으로 사용하여 선언 된 메소드를 호출합니다.
단순화 된 예를
는이 하나 가namespace TestGenerics
{
// Interface, of fields
interface IField
{
}
// Interface: Forms (contains fields)
interface IForm<T> where T : IField
{
}
// CONCRETE CLASES
class Field : IField
{
}
class Form <T> : IForm<T> where T : IField
{
}
// TEST PROGRAM
class Program
{
// THIS IS THE SIGNATURE OF THE METHOD I WANT TO CALL
// parameters are causing the error.
public static void TestMethod(IForm<IField> form)
{
int i = 1;
i = i * 5;
}
static void Main(string[] args)
{
Form<Field> b = new Form<Field>();
Program.TestMethod(b);
}
}
}
코드는 나에게 의미가 있습니다,하지만 난 컴파일러 오류 얻을 :
Argument 1: cannot convert from '
TestGenerics.Form<TestGenerics.Field>
' to 'TestGenerics.IForm<TestGenerics.IField>
' TestGenerics
내가 잘못 뭘하는지 모르겠어요를 , 나는 인터넷에서 많은 페이지를 읽었지 만 아무도 내 문제를 해결하지 못했습니다.
편집 :
내가 구축을 위해 노력하고있어의 많은 구조를 수정하지 할 수있는 솔루션이 있습니까 내가 그들을 구현 콘크리트 clases의 독립해야하도록하는 방식으로 인터페이스를 설계 . 콘크리트 클론은 dll에서로드 될 수 있지만 대부분의 어플리케이션은 인터페이스와 함께 작동합니다. 어떤 경우에는 특히 serialize해야하는 clases를 사용할 때 구체적인 clases를 사용해야합니다.미리 감사드립니다.
알레한드로
이것은 공분산의 영역에 속하는 것입니다. 특히,''out' 제네릭 수정 자 '(http://msdn.microsoft.com/en-us/library/dd469487.aspx)를 서명'interface IForm T : IField'에 추가하면 작동합니다 .그러나 이것은 다른 제한 사항/고려 사항을 추가하므로 현재 설계/사용에 적용 가능한지 여부를 말할 수 없습니다. –
나는이 디자인으로 무엇을 달성하려고하는지 궁금합니다. – sidesinger
두 명 모두에게 감사 드려요, 그들은 정말로 냉담했습니다. 나는 왜 그런 식으로 해결책을 가졌는지 설명하는 편집을 추가했지만, 두 사람 모두 내 문제를 해결할 수 있습니다. 문안 인사. – Sugar