当我进行一次垂头丧气时会发生什么?

时间:2014-05-11 09:45:20

标签: c# casting downcast

这究竟是如何运作的?

如果我有这个基类

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会发生什么? 虽然知道发生的事情是好的,但我也对为什么以这种方式工作感兴趣。

4 个答案:

答案 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