成员函数应更改调用对象的实例。但是我最近的尝试并没有改变实例。
我想提供一个基类,该基类实现了将字符串(或文件)反序列化为子类对象的功能。
是否有可能做这种事情?
编辑: 好吧,让我们忘记扩展方法。另一个尝试是:
class ChildClass : BaseClass
{
[XmlAttribute(AttributeName = "atribute")]
public string Atribute { set; get; }
}
class BaseClass
{
public void Deserialize(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
XmlSerializer serializer = new XmlSerializer(this.GetType());
return (BaseClass)serializer.Deserialize(reader);
}
}
}
class Program
{
public void Main()
{
ChildClass foo = new ChildClass();
// looks pretty bad and seems quite inconvenient to me
foo = (ChildClass)foo.Deserialize("file.xml")
}
}
我的“需要”是这样的:
class BaseClass
{
public void Deserialize(string filePath)
{
using (StreamReader reader = new StreamReader(filePath))
{
XmlSerializer serializer = new XmlSerializer(this.GetType());
this = (BaseClass)serializer.Deserialize(reader);
}
}
}
或者我可以使用构造函数吗?
最好的问候, 马丁
答案 0 :(得分:0)
这是不可能的。在您的情况下,“ bar”是静态方法范围内的局部变量,最终您将其重新分配给其他实例。您不是在处理同一个调用对象。
根据要尝试解决的解决方案,您可以将基类/子类分为两个单独的类,并在“子”中具有类型为“ base”的成员。
答案 1 :(得分:0)
我认为不可能从自身内部更改实例化的对象。但是,您可以将初始化代码作为基类的一部分放入静态方法中,该方法显式返回可以分配给新变量的对象的新实例。这样,您只需通过该方法实例化您的类一次。
基本上,您会这样做:
foo = (ChildClass)BaseClass.Deserialize("file.xml");
比从自身调用的方法重新分配foo干净一点。这样,您的BaseClass将具有:
public static BaseClass Deserialize(String filePath) { ... }