首页 新闻 会员 周边

这样的接口合理吗

0
悬赏园豆:5 [已解决问题] 解决于 2012-01-09 10:28
public interface IXmlSerialize<T> 
{
T FromXElement(XElement xelement);
XElement ToXElement(T obj);
}

有一个接口集成了这个接口

public interface IA : IXmlSerialize<IA>

{}

接下来一个类实现他们

public class A : IA

{

Public XElement ToXElement(IA a)

{}

Public IA FromXElement(XElement xelement)

{}

}
这样在调用的使用就会变成

IA a = new A();

XElement  element = a.ToXElement(a);

总觉得这里不合适,大家给个建议吧

leon_ALiang的主页 leon_ALiang | 初学一级 | 园豆:194
提问于:2011-12-28 15:52
< >
分享
最佳答案
0

应该是这样的

public interface IXmlSerialize

{

  object FromXElement(XElement element);

     XElement ToXElement(object o);

}

不需要为每个类型实现一个序列化操作。

也就是,不应该每增加一个类ClassA,就需要加一个XmlSerialzer<ClassA>的实现——这样的设计,不是单一变动的。

 

如果是每个类需要实现一个序列化和反序列化操作的话,应该这样设计。

public interface IXmlSerialiable

{

     void FromXElement(XElement element);

    XElement ToXElement();

}

让需要序列化的类继承这个接口。

在FromXElement中,对自身的属性进行赋值;在ToXElement中,生成一个XElement对象,取值来自于自身对象的属性值。

收获园豆:5
小彬 | 小虾三级 |园豆:947 | 2011-12-29 08:38
其他回答(2)
0
a.ToXmlElement(a);

为什么a自己的方法要把自己传进去?这里肯定不合理的。我看你提供的代码,大体上感觉你是把“被序列化的对象”和“序列化器”写在同一个类A里了。导致a的方法要把自己给传进去,因为a即是serializer,又是需要被序列化的instance。还是将两者分开比较好,否则会有这样的代码:

A a = new A();  //一个空的a,没什么用,只是为了调FromElement方法
a = a.FromElement(element); //我已经有a了,又重新赋值了一遍

应该有一个类大概叫 XxxSerializer,序列化的逻辑都在这里面,然后被序列化的对象(比如User, Order等)都跟序列化没有关系,他们压根就不知道什么是序列化。

水牛刀刀 | 园豆:6350 (大侠五级) | 2011-12-28 16:51

非常感谢!

其实可能我名字叫的不太好,IXmlSerialize的操作是和A,或者其他从IA继承的类(假如是B)有关系的
大概就是把A,B类中的属性或其他按照某种规则生成XML.或从XML中读取,给这些类的一些属性赋值。而且涉及到好多类都需要这种操作,这些处理又觉得一定要做,可能就给设计了这么个接口。
我在往下做的时候觉得有些不合适,求指点。。。。。。。

支持(0) 反对(0) leon_ALiang | 园豆:194 (初学一级) | 2011-12-28 17:11

@leon_ALiang: 也就是“A和其他从IA继承的类(如B)”这些是你要序列化的对象(业务模型对象)。它们不应该包含任何序列化相关的东西。你的序列化逻辑应该都在一个serializer类里,大概是这样:

class MySerializer<T> where T : IA  //只能处理某些特定的业务模型
{
public T FromXElement(XElement element) { ... }
public XElement ToXElement(T obj) { ... }
}



支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2011-12-28 17:21

@水牛刀刀: 

可是如果

public interface IB : IXmlSerialize<IA>

{}

public class B:IB

{}

这样还得在来一个类,主要是IA,IB的处理不同,没办法用一个T才做序列化和发序列化的所有操作
class MySerializer<T> where T : IB  //只能处理某些特定的业务模型
{
public T FromXElement(XElement element) { ... }
public XElement ToXElement(T obj) { ... }
}
支持(0) 反对(0) leon_ALiang | 园豆:194 (初学一级) | 2011-12-28 17:37

@leon_ALiang: 你别用IA IB了,你把实际上的类名说一下吧,不清楚要什么。

支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2011-12-28 17:42

@水牛刀刀: 

好的。

这是一组:

public interface IPrompt: IXmlSerialize<IPrompt>

{

}

public class Prompt : IPrompt

{

  public XElement ToXElement(IPrompt prompt){...}

  public IPrompt FromXElement(XElement xelement){...}

}

下面一组:

public interface IPromptGroup : IXmlSerialize<IPromptGroup>

{

}

public class PromptGroup : IPromptGroup

{

  public XElement ToXElement(IPromptGroup promptGroup){...}

  public IPromptGroup FromXElement(XElement xelement){...}

}

两个类中实现的两个方法是不一样的,都和具体的类有关。

他们按照各自的规则生成XElement.

支持(0) 反对(0) leon_ALiang | 园豆:194 (初学一级) | 2011-12-28 17:59

@leon_ALiang: 既然你自己都说了没什么共同的,跟具体类有关,那有什么好抽象出来的呢?

支持(0) 反对(0) 水牛刀刀 | 园豆:6350 (大侠五级) | 2011-12-28 18:10

@水牛刀刀:
共同点就是都需要实现IXmlSerialize接口的两个方法啊

支持(0) 反对(0) leon_ALiang | 园豆:194 (初学一级) | 2011-12-28 18:26
0

你不需要一个泛型类吧,改成两个泛型方法就好了。如前面几位所说把你的序列化操作和数据对象分离。

其实样的设计,我个人建议先在.net framework里找找类似的设计,会给你很多启发的

Jason Go | 园豆:298 (菜鸟二级) | 2012-01-09 10:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册