C# · 12月 25, 2021

c# – 如何将Animal实例转换为Dog实例?

说我有以下课程: class Animal{ public long Id { get; set; } public string Name { get; set; }}class Dog:Animal{ public void sniffBum() { Console.WriteLine(“sniff sniff sniff”); }}

如果我有动物实例,我该如何将其投射到狗身上?
像这样的东西:

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

基本上我不能使用接口.我将永远有一个Animal对象从我的数据库中出来.狗没有比Animal更多的参数,只有新的方法.

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

解决方法 如果Animal实例从未是Dog实例,则转换检查将不起作用.

您可能需要查看Decorator Pattern,它允许您将Dog方法添加到Animal实例.从本质上讲,狗和动物都有IAnimal接口. Dog类在构造函数中获取Animal实例并保留内部引用. Dog的IAnimal实现只是延伸到它引用的Animal实例(它允许将Dog转换为IAnimal并且表现得像包装的Animal for polymorphism).狗也有其他特定狗的方法.