这究竟是如何运作的?
如果我有这个基类
public class BaseClass
{
public int Value1 { get; set; }
public int Value2 { get; set; }
public BaseClass SimpleClone()
{
BaseClass result = new BaseClass();
result.Value1 = this.Value1;
result.Value2 = this.Value2;
return result;
}
}
这个儿童班
public class DerivedClass : BaseClass
{
public bool Value3 { get; set; }
public DerivedClass()
{
Value3 = true;
}
}
如何将BaseCast.SimpleClone()
转发为anotherObj
? Value3会发生什么?
虽然知道发生的事情是好的,但我也对为什么以这种方式工作感兴趣。
答案 0 :(得分:5)
如果我理解正确,您的问题是当您执行以下操作时会发生什么
DerivedClass derived = (DerivedClass)baseObj.SimpleClone();
你试过那个吗?由于InvalidCastException
不是BaseClass
,因此只会导致DerivedClass
。
我有answered a similar question here,这应该清楚了。
答案 1 :(得分:2)
你的沮丧的答案是否定的,根据SriRam的回答,它无法完成。虽然相当混乱,但您可以通过使用多态性来实现克隆。在执行此操作时,您可能需要将创建和分配的问题分开:
public class BaseClass
{
public int Value1 { get; set; }
public int Value2 { get; set; }
protected virtual BasedClass Create()
{
return new BaseClass();
}
public virtual BaseClass SimpleClone()
{
var clone = Create(); // The appropriate create will be called
clone.Value1 = this.Value1;
clone.Value2 = this.Value2;
return clone;
}
}
public class DerivedClass : BaseClass
{
public bool Value3 { get; set; }
public DerivedClass()
{
Value3 = true;
}
protected override BasedClass Create()
{
return new DerivedClass();
}
public override BaseClass SimpleClone()
{
var result = base.SimpleClone();
(result as DerivedClass).Value3 = this.Value3;
}
}
答案 2 :(得分:2)
现在的问题没有意义。无法进行向下转换,因为您的克隆方法已经返回基类。我认为你应该在这里做的是覆盖子类中的clone方法:
public class DerivedClass : BaseClass
{
//... Other stuff
public BaseClass SimpleClone()
{
var result = new DerivedClass
{
Value1 = this.Value1,
Value2 = this.Value2,
Value3 = this.Value3,
}
return result;
}
现在,如果您有一个DerivedClass
类型的对象并且在其上调用clone,则由于方法签名,编译器不知道返回的对象是DerivedClass
类型。但是你这样做,所以在这种情况下你可以施放物体。它只是告诉编译器:'我知道更好,你认为这是一个BaseClass
,但它实际上是一个DerivedClass
'。它没有运行时影响,因为您不更改对象的类型,您只为编译器提供额外信息。
答案 3 :(得分:1)
它不起作用。转换是告诉编译器将对象视为类似于转换对象的对象,并且您知道信息丢失。
仅仅因为派生类是从基类派生的,并不一定意味着两者都是相同的。
所以,你会得到InvalidCastException
。