一度「動物として生まれた」の生命はAnimal
として生きるでしょう。派生クラスにキャストしようとすることはできますが、インスタンス自体はAnimal
のままなので、すべてのケースで失敗します。ここで
は、あなたが他のクラスにそれを変更することができますどのようにいくつかの提案は以下のとおりです。
あなたは静的メソッドを使用して明示的に実装することにより、別のクラスにカスタム変換を実装することができ、例えば、あなたが何かを実装することができます
を
public class Cat : Animal
{
public Cat FromAnimal(Animal animal)
{
return new Cat(animal) {Eyes = Color.Blue, ... };
}
}
別のクラスでデシリアライズをサポートする特定のシリアライザを使用して、インスタンスをシリアライズしてからデシリアライズできます。
明示的な戻り型の派生型を使用してインスタンスのディープ・クローニングを実装できます。
次に、古いAnimal
をnew-bord Cat
に置き換えて、どこでも使用できます。
/// <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;
}
}
するか、あなたが必要とするすべての変換を管理するために、単一のファクトリクラスを使用します。
これを試してみるとどうなりますか? AnimalとDogの2つのクラスを持つコンソールアプリケーションを作成します。あなたが使用されているものがはっきりと分かるように、それらを十分に異なるものにして、キャストしてみてください。エラーが発生した場合は、投稿してください。 – taylonr