如何将Animal实例转换为Dog实例?

Cru*_*ler 6 c# oop inheritance

说我有以下课程:

class Animal
{
    public long Id { get; set; }
    public string Name { get; set; }
}

class Dog:Animal
{
    public void sniffBum()
    {
        Console.WriteLine("sniff sniff sniff");
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我有一个实例Animal,我该如何将其转换为Dog?像这样的东西:

Animal a = new Animal();
if ( some logic to determine that this animal is a dog )
{
    Dog d = (Dog)a;
    d.sniffBum();
}
Run Code Online (Sandbox Code Playgroud)

基本上我不能使用接口.我将永远有一个Animal像我这样的数据库.Dog没有任何参数Animal,只有新方法.

我可以创建一个新Dog对象,并传递值,(或者有一个带有类型的构造函数Animal),但这看起来很麻烦.

Dr *_*bie 2

Animal如果实例从来都不是实例,则强制转换检查将不起作用Dog

您可能想查看装饰模式,它允许您Dog向实例添加方法Animal。本质上,Dog两者Animal都有IAnimal接口。该类在构造函数中Dog获取一个Animal实例并保留内部引用。的Dog实现IAnimal只是遵循Animal它引用的实例(这允许将Dog强制转换为并表现得像多态性的IAnimal包装)。Animal它还Dog具有特定于 Dog 的其他方法。