如何在使用 AbstractFactory-Pattern 和多态性的情况下实现 IXmlSerializable.ReadXml
How to implement IXmlSerializable.ReadXml in case of using AbstractFactory-Pattern and Polymorphism
我在项目中使用了 AbstractFactory 和多态性,需要根据父项下的 xml 元素将 xml 反序列化为正确的类型。
更具体的(一些伪代码解释):
Public Interface IAnimal
Inherits IXmlSerializable
Public Property Name as String
Public Property Age as Integer
Public ReadOnly Property Type as AnimalType 'actually this is en Enum
End Interface
Public Interface IAnimalFactory
Public Function Breed(animalType as AnimalType) as IAnimal
End Interface
Public Class AnimalFactoryImpl
Implements IAnimalFactory
Public Function Breed(animalType as AnimalType) as IAnimal
Select Case animalType
case ...
return new Dog()
End Select
End Function
End Class
Public Mustinherit Class AnimalBaseImpl
Implement IAnimal
'do all the general stuff common to all animals here
Public MustOverride Sub Talk(words As String)
'implement IXmlSerializable.ReadXml here
'implement IXmlSerializable.WriteXml here
End Class
Public Class Dog
Inherits AnimalBaseImpl
'do dog specifics here
'implement Talk() here
End Class
Public Class Cat
Inherits AnimalBaseImpl
'do cat specifics here
'implement Talk() here
End Class
Public Class Cow
Inherits AnimalBaseImpl
'do cowspecifics here
'implement Talk() here
End Class
我need/have的xml长得像他的
<animal>
<animalType>Dog</animalType>
<name>Snoopy</name>
<age>62</age>
</animal>
实现WriteXml 方法很容易。
但是,ReadXml 让我很头疼。
到目前为止,我已将反序列化代码包含在父对象(例如 Farm)中。我从动物标签中读取所有元素,然后调用 animalFactory 以根据 animalType 创建正确的类型。
我认为这真的不是很好的代码,它确实应该进入 AnimalBaseImpl 或工厂,但我不知道如何做到这一点,因为 new AnimalBaseImpl() 是 de 时将发生的第一件事-序列化...
欢迎任何提示和技巧:-)
好的,我想了想,自己想出了解决办法。一旦你到达那里就很容易了;-)
因为我使用的是工厂模式,所以工厂需要实现反序列化。这毕竟是一种创造模式。这意味着,所有创建方法都应该进入该工厂。而反序列化是一种创建方式。
我需要做的就是将 XmlReader 对象传递给工厂,并期待工厂创建的任何内容的 return。
继续上面的代码示例:
Public Interface IAnimalFactory
Public Function Breed(animalType as AnimalType) as IAnimal
Public Function XmlDeserializeAnimal(reader As XmlReader) As IAnimal
End Interface
Public Class AnimalFactoryImpl
Implements IAnimalFactory
Public Function Breed(animalType as AnimalType) as IAnimal
Select Case animalType
case ...
return new Dog()
End Select
End Function
Public Function XmlDeserializeAnimal(reader As XmlReader) As IAnimal implements IAnimalFactory.XmlDeserializeAnimal
'read all the tags here inkl. animalType
Dim returnAnimal as IAnimal = Me.Breed(animalType)
'set name and age here as per xml
Return returnAnimal
End Class
现在可以通过同样实现 IXmlSerializable 的容器对象(例如 Farm)轻松调用它。
所有容器 class 需要知道的是 IAnimalFactory 和 XmlDeserializeAnimal 方法。
想想还是比较直接的(^_~)
我在项目中使用了 AbstractFactory 和多态性,需要根据父项下的 xml 元素将 xml 反序列化为正确的类型。
更具体的(一些伪代码解释):
Public Interface IAnimal
Inherits IXmlSerializable
Public Property Name as String
Public Property Age as Integer
Public ReadOnly Property Type as AnimalType 'actually this is en Enum
End Interface
Public Interface IAnimalFactory
Public Function Breed(animalType as AnimalType) as IAnimal
End Interface
Public Class AnimalFactoryImpl
Implements IAnimalFactory
Public Function Breed(animalType as AnimalType) as IAnimal
Select Case animalType
case ...
return new Dog()
End Select
End Function
End Class
Public Mustinherit Class AnimalBaseImpl
Implement IAnimal
'do all the general stuff common to all animals here
Public MustOverride Sub Talk(words As String)
'implement IXmlSerializable.ReadXml here
'implement IXmlSerializable.WriteXml here
End Class
Public Class Dog
Inherits AnimalBaseImpl
'do dog specifics here
'implement Talk() here
End Class
Public Class Cat
Inherits AnimalBaseImpl
'do cat specifics here
'implement Talk() here
End Class
Public Class Cow
Inherits AnimalBaseImpl
'do cowspecifics here
'implement Talk() here
End Class
我need/have的xml长得像他的
<animal>
<animalType>Dog</animalType>
<name>Snoopy</name>
<age>62</age>
</animal>
实现WriteXml 方法很容易。 但是,ReadXml 让我很头疼。
到目前为止,我已将反序列化代码包含在父对象(例如 Farm)中。我从动物标签中读取所有元素,然后调用 animalFactory 以根据 animalType 创建正确的类型。
我认为这真的不是很好的代码,它确实应该进入 AnimalBaseImpl 或工厂,但我不知道如何做到这一点,因为 new AnimalBaseImpl() 是 de 时将发生的第一件事-序列化...
欢迎任何提示和技巧:-)
好的,我想了想,自己想出了解决办法。一旦你到达那里就很容易了;-)
因为我使用的是工厂模式,所以工厂需要实现反序列化。这毕竟是一种创造模式。这意味着,所有创建方法都应该进入该工厂。而反序列化是一种创建方式。
我需要做的就是将 XmlReader 对象传递给工厂,并期待工厂创建的任何内容的 return。
继续上面的代码示例:
Public Interface IAnimalFactory
Public Function Breed(animalType as AnimalType) as IAnimal
Public Function XmlDeserializeAnimal(reader As XmlReader) As IAnimal
End Interface
Public Class AnimalFactoryImpl
Implements IAnimalFactory
Public Function Breed(animalType as AnimalType) as IAnimal
Select Case animalType
case ...
return new Dog()
End Select
End Function
Public Function XmlDeserializeAnimal(reader As XmlReader) As IAnimal implements IAnimalFactory.XmlDeserializeAnimal
'read all the tags here inkl. animalType
Dim returnAnimal as IAnimal = Me.Breed(animalType)
'set name and age here as per xml
Return returnAnimal
End Class
现在可以通过同样实现 IXmlSerializable 的容器对象(例如 Farm)轻松调用它。 所有容器 class 需要知道的是 IAnimalFactory 和 XmlDeserializeAnimal 方法。
想想还是比较直接的(^_~)