Я использую 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
XML, который мне нужен / имеет, выглядит как его
<animal>
<animalType>Dog</animalType>
<name>Snoopy</name>
<age>62</age>
</animal>
Легко реализовать метод WriteXml.Однако ReadXml вызывает у меня головную боль.
Пока что я включил код десериализации в родительский объект (например, Farm).Я прочитал все элементы внутри тега animal и затем вызвал animalFactory для создания правильного типа в зависимости от animalType.
Я думаю, что это действительно нехороший код, и он действительно должен идти в AnimalBaseImpl или на фабрику.но я в растерянности, как это сделать, так как новый AnimalBaseImpl () - это первое, что произойдет при десериализации ...
Любые подсказки и трюки приветствуются: -)