2012-07-20 4 views
2

ObservableCollection에서 파생 된 클래스를 만들고 특정 기본 클래스 (BaseMetadata)에서만 사용되도록 클래스를 제한하려고합니다. 또한 컬렉션에 지속성 기능을 추가 할 때 IXmlSerializable 인터페이스를 구현해야합니다. 여기 제네릭 상속을 사용하는 클래스 및 인터페이스를 정의합니다.

은 ...
public class CollectionMetadata<T> : ObservableCollection<T> where T : BaseMetadata, 
            IXmlSerializable 
{ 
    XmlSchema IXmlSerializable.GetSchema() 
    { 
     return null; 
    } 

    public void ReadXml(XmlReader reader) 
    { 
    } 

    public void WriteXml(XmlWriter writer) 
    { 
    } 
} 

합니다 ... BaseMetadata는 오류가 발생 여전히 빈 클래스로 간체 할 수 있습니다 ...

public class BaseMetadata 
{ 
} 

컬렉션의 클래스 정의이다. .. 다음 오류가 발생합니다 ....

CollectionMetadata<T>.IXmlSerializable.GetSchema()': 
    containing type does not implementinterface 
    'System.Xml.Serialization.IXmlSerializable' 

... 위의 코드에서 ...

XmlSchema IXmlSerializable.GetSchema() 

나는 정말 명백한 것이 빠져 있어야합니까?

답변

2

현재 양식에서는 을 T의 제약 조건으로 적용하고 있습니다. CollectionMetadata<T>의 인터페이스로 선언하지 않았습니다. 따라서 인터페이스를 찾을 수 없기 때문에 명시 적 인터페이스 구현이 신음합니다. 그렇지 않으면이 수, 잠재적으로이에 대한 명시 적 인터페이스 구현을 사용하는 정말 좋은 것 - 보조 노트로

public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable 
            where T : BaseMetadata 

:

당신은 전에 제약 조건을 IXmlSerializable 인터페이스를 이동해야 나중에 진짜 머리 숙녀가되었습니다. 공용 메서드로 컴파일러가이 시점에서 신음을하지 않기 때문에 컬렉션을 IXmlSerializable으로 전달하려고 시도하면 불만을 제기했을 것입니다.

1

TIXmlSerializable 인터페이스를 구현한다고 말합니다. 아마도 당신은 실제로ColelctionMetadata<T> 그것을 구현하는 말을 의미 : 심지어 인터페이스없이 그들은 단지 일반적인 방법처럼 보이는대로, 문제로 존재하지 않습니다

public class CollectionMetadata<T> : ObservableCollection<T>, IXmlSerializable 
     where T : BaseMetadata 

ReadXmlWriteXml. 그러나 컴파일러에서는 실제로 이러한 메서드를 구현하지 않는 한 "명시 적 인터페이스 구현"을 사용하지 않으며 XmlSchema IXmlSerializable.GetSchema()은 명시 적 인터페이스 구현입니다.

관련 문제