是否可以定义一个成员函数,其返回类型与作为成员的类相同。
例如:
public class Cars
{
int Model
int Make
Cars CreateDeepCopy()
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, this);
ms.Position = 0;
return (Cars)formatter.Deserialize(ms);
}
}
}
答案 0 :(得分:1)
当然,只需确保您完善语法以使其成为有效的C#以便编译并使用[Serializable]
属性装饰您的类,否则您将无法使用BinaryFormatter对其进行序列化:
[Serializable]
public class Cars
{
public int Model;
public int Make;
public Cars CreateDeepCopy()
{
using (var ms = new MemoryStream())
{
var formatter = new BinaryFormatter();
formatter.Serialize(ms, this);
ms.Position = 0;
return (Cars)formatter.Deserialize(ms);
}
}
}
答案 1 :(得分:1)
是的,使用您在示例中使用的确切语法。但请注意,这不会尊重继承,因此如果您有Cars
的子类,CreateDeepCopy
仍会输入Cars
(尽管返回的对象由于BinaryFormatter
的工作原理,它将是子类型。如果需要,可以通过“方法隐藏”解决这个问题,即
[Serializable] class SomeSpecialCar : Cars {
new public SomeSpecialCar CreateDeepCopy() {
return (SomeSpecialCar)base.CreateDeepCopy();
}
}
另请注意,Cars
似乎代表单个实例,因此应该是Car
。
答案 2 :(得分:0)
为什么不,你的实施有什么问题?使用块返回null,它应该是文件。您可以返回相同的实例以及新实例或默认实例。
答案 3 :(得分:0)
是的,确实如此。要克隆您的课程,您可以实施ICloneable
而不是CreateDeepCopy
方法。但是,它返回一个对象,要求调用者将其强制转换回Cars
。