从基地铸造到衍生?

时间:2011-12-13 20:08:13

标签: c# casting

是否可以将对象从基础转换为派生对象?例如,假设我有一个基础对象:Animal。由此我得出了几个其他类:CatDog。 现在我需要一个Animal,但此刻的类型并不重要。所以,

Animal blankCanvas = new Animal();

一路上我改变主意,现在想要将Animal更改为Dog。但是,我不明白我会怎么做。我知道从Animal转换为Dog的业务规则,但我不知道如何实现它。

5 个答案:

答案 0 :(得分:3)

是的,您可以对派生引用强制转换基础引用。

但您似乎想要转换实例。这不是铸造,也不是直接可能的。

您的逻辑应该是这样的,以便您在创建它时知道您想要的类型。

以下内容可能有意义:

Animal blankCanvas = null;
...
blankCanvas = new Dog();

为了帮助您保持正确的路径,请将Animal定义为abstract class
毕竟,Animal的实例代表什么?

答案 1 :(得分:2)

您可以在派生类上使用静态方法,如下所示:

/// <summary>
/// Dog.
/// </summary>
class Dog : Animal
{
    /// <summary>
    /// Initializes a new instance of the <see cref="Dog"/> class.
    /// </summary>
    /// <param name="type">The type.</param>
    public Dog(string type)
        : base(type)
    { }

    /// <summary>
    /// Gets a dog from an animal.
    /// </summary>
    /// <param name="animal">The animal.</param>
    /// <returns></returns>
    public static Dog FromAnimal(Animal animal)
    {
        return new Dog(animal.Type);
    }
}

/// <summary>
/// Animal.
/// </summary>
class Animal
{
    /// <summary>
    /// Gets or sets the type.
    /// </summary>
    /// <value>The type.</value>
    public string Type { get; private set; }

    /// <summary>
    /// Initializes a new instance of the <see cref="Animal"/> class.
    /// </summary>
    /// <param name="type">The type.</param>
    public Animal(string type)
    {
        this.Type = type;
    }
}

或使用单个工厂类来管理您需要的所有转化。

答案 2 :(得分:1)

如果不编写自定义转换,则无法执行此操作。可能更好的做法是更早地决定你需要什么样的派生类型并创建它的实例。

大多数情况下,类型系统会以这种方式打击你,你需要重新设计你的架构。

答案 3 :(得分:0)

据我所知,你不能用强制转换做到这一点,但你可以在Dog中使用一个构造函数来接受动物作为这样的参数:

Public Dog(Animal pAnimal)
{
    //do stuff...
}

答案 4 :(得分:0)

你的班级曾经“作为动物出生”的例子将以Animal的形式存在。您可以尝试将其强制转换为派生类,但由于实例本身仍为Animal,因此在所有情况下都会失败。

以下是一些如何将其更改为其他类的建议:

您可以通过使用静态方法显式实现自定义转换到另一个类,例如,您可以实现以下内容:

public class Cat : Animal
{
 public Cat FromAnimal(Animal animal)
 {
   return new Cat(animal) {Eyes = Color.Blue, ... };
 }
}

您可以使用支持在另一个类中进行反序列化的某些序列化程序来序列化然后反序列化您的实例。

您可以使用派生类型的显式返回类型实现实例的深度克隆。

然后,您只需将旧版Animal替换为新版Cat并在任何地方使用它......