C#双重标准?

时间:2009-01-29 22:51:16

标签: c# interface

我在两个类中做了完全相同的事情,并且在一个编译器允许它很好,但另一个给我一个错误。为什么双重标准?有15个类使用相同的模式,但只有一个拒绝编译,说出以下错误:

  

'AWWAInvoicingXML.AwwaTransmissionInfo'   没有实现接口成员   'AWWAInvoicingXML.IXmlSerializable.fromXML(System.Xml.XmlDocumentFragment)'。   'AWWAInvoicingXML.AwwaTransmissionInfo.fromXML(System.Xml.XmlDocumentFragment)'   是静态的,不是公共的,或者是   错误的退货类型。

这是我的源代码...如果我注释掉AwwaTransmissionInfo类,文件的其余部分编译得很好,所以我知道它不是编译器在第一个错误之后死亡的那个。而且我知道,我知道,我在这里尝试做的是内置的东西,但我只是假设我真的知道我在做什么并跳过内置的序列化器是有原因的:)

    public interface IXmlSerializable {
    //if this interface is implemented, the object can be serialized to XML
    string toXML();
    IXmlSerializable fromXML(XmlDocumentFragment inXml);
}

public class AwwaTransmissionInfo : IXmlSerializable {

    public DateTime DateTime = DateTime.Now;
    public int ItemCount;

    public string toXML() {
        throw new Exception("The method or operation is not implemented.");
    }

    public AwwaTransmissionInfo fromXML(XmlDocumentFragment inXml) {
        throw new Exception("The method or operation is not implemented.");
    }

}

public class CEmail {
    public string Email = "";

    public string toXML() {
        throw new System.Exception("The method or operation is not implemented.");
    }

    public CEmail fromXML(XmlDocumentFragment inXml) {
        throw new System.Exception("The method or operation is not implemented.");
    }
}

6 个答案:

答案 0 :(得分:10)

问题是方法签名必须与接口完全匹配。

最简单的解决方案是改变

    public AwwaTransmissionInfo fromXML(XmlDocumentFragment inXml) {

    public IXmlSerializable fromXML(XmlDocumentFragment inXml) {

如果您对此不满意,可以明确实现该接口。加上这个:

    public IXmlSerializable IXmlSerializable.fromXML(XmlDocumentFragment inXml) {
        return this.fromXML(inXml);
    }

然后你将有两个fromXML()的定义,一个用作被调用为类的实例时使用,一个用于通过接口调用时使用。

答案 1 :(得分:2)

IXmlSerializable已存在于.NET框架中。我会建议你在自己离开之前实施它并重新发明轮子。

请参阅msdn 1

关于你的代码无法编译的原因:

fromXml方法需要返回IXmlSerializable。

public IXmlSerializable fromXML(XmlDocumentFragment inXml)
{
    throw new Exception("The method or operation is not implemented.");
}

如果您想返回其他内容,请考虑使用通用界面。

IE。

public interface IXmlSerializable<T>
{
    //if this interface is implemented, the object can be serialized to XML
    string toXML();
    T fromXML(XmlDocumentFragment inXml);
}

public class AwwaTransmissionInfo : IXmlSerializable<AwwaTransmissionInfo>
{

    public DateTime DateTime = DateTime.Now;
    public int ItemCount;

    public string toXML()
    {
        throw new Exception("The method or operation is not implemented.");
    }

    public AwwaTransmissionInfo fromXML(XmlDocumentFragment inXml)
    {
        throw new Exception("The method or operation is not implemented.");
    }
}

答案 2 :(得分:1)

AwwaTransmissionInfo.fromXml需要返回IXmlSerializable类型,而不是AwwaTransmissionInfo

答案 3 :(得分:1)

CEmail类编译正常的原因是因为它没有标记为实现接口。当我这样标记它时,我得到了与其他类相同的错误。以下是它必须如何...我没有注意到这一点非常愚蠢。我们现在面临很大的压力,我不敢相信我在发布问题之前就已经盯着这段代码了一个小时,而且这很简单......总是我想:)

    public interface IXmlSerializable {
    //if this interface is implemented, the object can be serialized to XML
    string toXML();
    IXmlSerializable fromXML(XmlDocumentFragment inXml);
}

public class AwwaTransmissionInfo : IXmlSerializable {

    public DateTime DateTime = DateTime.Now;
    public int ItemCount;

    public string toXML() {
        throw new Exception("The method or operation is not implemented.");
    }

    public IXmlSerializable fromXML(XmlDocumentFragment inXml) {
        throw new Exception("The method or operation is not implemented.");
    }

}

public class CEmail : **IXmlSerializable** {
    public string Email = "";

    public string toXML() {
        throw new System.Exception("The method or operation is not implemented.");
    }

    public IXmlSerializable fromXML(XmlDocumentFragment inXml) {
        throw new System.Exception("The method or operation is not implemented.");
    }
}

答案 4 :(得分:0)

您的CEmail类根本没有实现IXmlSerializable接口。实现它,并将CEmail和AWwaTransmissionInfo的返回类型从XML更改为IXmlSerializable。

public IXmlSerializable fromXML(XmlDocumentFragment inXml){
   throw new System.Exception("The method...");
}

答案 5 :(得分:0)

派生的AwwaTransmissionInfo类上的“fromXml”方法返回AwwaTransmissionInfo类型,其中接口定义该方法应返回IXmlSerializable类型。由于AwwaTransmissionInfo来自IXmlSerializable,你会认为,哦,很酷,它可以工作,但它不在接口上。我认为这将是差异(反对或共同,我永远不会记得哪一个)??

如果你使用泛型来重构它,那么你可以使用一个约束来解决其中的一些问题。