2010-08-09 1 views
0

다음과 같은 경우가 있습니다. 이 코드는 Test2에 대해 컴파일러 오류를 발생시킵니다..net 제네릭 제약 및 개체 상속 컴파일 문제

제네릭 형식 또는 메서드 'panelGenericIOGrid'에서 'InheritedChild'형식 매개 변수 'T'로 사용할 수 없습니다. 'InheritedChild'에서 'SerializerBase'로의 암시 적 참조 변환은 없습니다.

public class SerializerBase<T> 
{ 
} 
public class DirectChild : SerializerBase<DirectChild> 
{ 
} 
public class InheritedChild : DirectChild 
{ 
} 

public class panelGenericIOGrid<T> : UserControl 
    where T: SerializerBase<T>, new() 
{ 
} 

... 
panelGenericIOGrid<DirectChild> test; 
panelGenericIOGrid<InheritedChild> test2; 
... 

나는 나의 implentation이 funadmentally wrong라고 확신한다. 다음과 같은 상황에서, DirectChild와 InheritedChild는 모두 SerializerBase 생성자에 적절한 타입을 제공합니다.

어떻게 코드를 작동시켜야합니까? 감사!

실제 정보에 대한 정보입니다. SerializerBase에는 유형에 따라 자동으로 직렬화 및 비 직렬화되도록 구현 된 정적 함수 세트가 있습니다.

DirectChild에는 디스크에 저장되어 복구 될 문자열 집합이 있습니다.

Inhertiedchild에는 DirectChild의 모든 멤버와 더 많은 멤버가 있습니다.

는 기본적으로 나는 직렬화가 SerializeBase

답변

1

당신이 인터페이스를 놓치고있어 나에게 같다 : 나는 비록 당신의 디자인을 변경하는 방법을 모르는

public interface ISerializerBase<T> { } 
public class SerializerBase<T> : ISerializerBase<T> { } 
public class DirectChild : SerializerBase<DirectChild> { } 
public class InheritedChild : DirectChild, ISerializerBase<InheritedChild> { } 
public class panelGenericIOGrid<T> where T: ISerializerBase<T>, new() { } 

. InheritedChild에 일부 상속 된 메서드 나 일부 인터페이스 메서드를 다시 구현해야 할 수도 있습니다.

public interface MSerializable {} 
public static class Serializable { 
    public static void Serialize(this MSerializable self, string fileName) { 
    // self will refer to the right type, 
    // no need to use generics if all you want is to serialize it ... 
    } 
} 

public class DirectChild : MSerializable { } 
public class InheritedChild : DirectChild { } 
public class panelGenericIOGrid<T> where T: MSerializable, new() { } 

당신이 바이너리 직렬화를 할 것인가, 또는 당신은 XML로 직렬화됩니다

하지만, 어쩌면 당신이 otherwise을 할 수 있습니까?

+0

인터페이스가 가장 좋은 방법이라고 생각합니다. 추가 코드가 될 것이지만 BaseSerializer의 모든 메서드는 정적이므로 너무 많은 추가 작업이 필요하지 않습니다. 감사! – greggorob64

+0

모든 메서드가 정적이라면 나는 정말로 믹스 인 접근법을 따라야한다고 생각한다. 상속은 인터페이스에서 정적 메서드를 가질 수없고 정적 인 인터페이스 메서드를 구현할 수 없으므로이 경우에 이해가되지 않는다. 사람. –

2

의 공개 구성원 DirectChild.Serialize (파일 이름) 및 IndirectChild.Serialize (파일 이름)을 필요 해요 InheritedChildSerializerBase<InheritedChild>를 구현하지 않는 문제가있다, 따라서 T에 대한 제약 조건을 panelGenericIOGrid<T>에 충족하지 못합니다.

불행히도 그 해결책은 우리가 당신이 성취하려는 것을 알지 못하는 것임을 의미하지 않습니다.

SerializerBase<T>의 실제 회원은 어떤 사람들인가요? 당신이 우리에게 더 많은 맥락을 줄 수 있다면, 그것은 우리가 당신을 도울 수 있도록 도와 줄 것입니다.

+0

편집을 참조하십시오. 일부 정보가 추가되었습니다. – greggorob64