代码之家  ›  专栏  ›  技术社区  ›  Francesco Belladonna

在C中使用属性/接口的区别#

  •  3
  • Francesco Belladonna  · 技术社区  · 14 年前

    这不是一个恰当的问题,但更像是我最近的一个想法。 我以xmlattribute to xmlserialize一个类为例:您可以设置一个类的属性来选择哪些属性应该被序列化,但是同样的事情可以通过实现一个teorical接口ixmlserializable(它确实存在一些类似的东西,我不记得了)和通过重载该类的方法“serialize”来完成。它只对要序列化的属性(this.myprop1.serialize())调用serialize,对反序列化也是如此

    所以我的基本意思是:属性方法不是有点多余吗?(实际上我喜欢它,但我发现它在逻辑上与接口没有区别)

    谢谢你的回答,就像我说的,这只是一个想法…希望有人会觉得有趣

    更新1: 好吧,我用一种错误的方式解释了自己,我想问的是“为什么我应该选择属性而不是接口(或相反的接口)”,而不是这个特定的情况(我之所以选择序列化是因为它是我脑海中第一个弹出的东西),顺便感谢你的回答,因为它们非常有趣。

    4 回复  |  直到 9 年前
        1
  •  4
  •   dbc    9 年前

    好吧,据我所知,它们在逻辑上是不同的。

    实现IXMLSerializable直接影响类本身,因为您正在向类的实现中添加接口和一个或多个方法。本质上,您正在使自己的类直接负责它的序列化。

    但是,添加xmltattribute属性不会直接影响类的功能,相反,您只是用属性对其进行修饰,以便xmlserializer可以执行实际的序列化功能。在这种情况下,您将把序列化推迟到xmlserializer类,并为xmlserializer提供足够的关于类的元数据来完成它的工作。

    这就是为什么我更喜欢后一种属性方法。当我编写一个类时,我希望它是可序列化的,但我最不关心的是实现的细节,所以我总是从thaqt方法开始,99%的时间它可以很好地工作,很少工作。但是,如果确实需要对序列化进行更精细的粒度控制,则实现IXML可序列化接口并编写自己的序列化代码。

        2
  •  8
  •   Marc Gravell    14 年前

    从评论和投反对票来看,也许我应该在这里强调我的主要观点:一些可以拯救我的东西 小时 工作(每种类型)和可怕的代码复杂性非常大 多余,但非常欢迎。


    “相当容易”?好的;我在序列化方面很有经验,但是实现它的方法是 我所说的轻松。事实上,恰恰相反。

    如果不想使用属性,则存在一个重载 XmlSerializer 这允许您在运行时配置它。

    但每当我听到“工具”时,我都会发抖。 IXmlSerializable “。属性方法非常快速和简单:

    [XmlRoot("foo"), XmlType("foo")]
    [XmlInclude(typeof(SuperFoo))]
    public class Foo {
        public string X {get;set;}
    
        [XmlAttribute("y")]
        public int? Y {get;set;}
    
        [XmlElement("item")]
        public List<string> Items {get;set;}
    }
    public class SuperFoo : Foo {}
    

    我要求你写一篇 稳健的 执行 IXML可序列化 为此 非常简单的例子 不到2小时…记住,你写的每一行都是你必须维护的一行。

        3
  •  1
  •   Steven Sudit    14 年前

    实现接口的编程方法可能会提供更多的控制(并且可能更快),但与属性方法相比,创建和维护起来更困难。我主要使用属性。

        4
  •  1
  •   serhio    14 年前

    你可以 选择 要用属性序列化的属性。接口的实现是通过代码序列化的。