我需要访问名为 CanFly 的对象的属性animalObj
,但我不知道如何。
我怎样才能进入该物业?
我测试了animalObj[Owl][Bird][Animal]
但没有运气。
类的结构:
动物 --> 鸟 --> 猫头鹰
猫头鹰有属性 CanFly
我需要访问名为 CanFly 的对象的属性animalObj
,但我不知道如何。
我怎样才能进入该物业?
我测试了animalObj[Owl][Bird][Animal]
但没有运气。
类的结构:
动物 --> 鸟 --> 猫头鹰
猫头鹰有属性 CanFly
我从该屏幕截图中了解到,您animalObj
是 的一个实例Owl
,我认为该类继承自Bird
,而该类继承自Animal
。
Animal
有一个名为 的属性CanFly
。
如果我的假设是正确的,你只需要写:
animalObj.CanFly
假设您已将CanFly
可见性设置为public
.
如果您有一个Animal
您知道是 an的实例Owl
,并且只有Owl
property CanFly
,则必须将该对象强制转换为 anOwl
才能访问该属性。
(animalObj as Owl).CanFly
您可以使用运算符检查这是否Animal
真的是一个:Owl
is
if (animalObj is Owl)
{
Owl owl = animalObj as Owl;
}
此外,CanFly
仅拥有该属性Owl
没有多大意义,除非您的问题域专门处理哪些猫头鹰可以飞,哪些不能。
虽然这个答案是正确的,但它不是很优雅或灵活。我建议在基类中添加能力列表,并在每个继承类中添加适当的能力。
public enum AnimalCapability
{
Run,
Fly,
Devour
}
public abstract class Animal
{
public virtual string Name { get { return "Undefined"; } }
protected IEnumerable<AnimalCapability> Capabilities;
public bool HasCapability(AnimalCapability capability)
{
if (this.Capabilities != null)
return this.Capabilities.ToList().Contains(capability);
return false;
}
}
public class Jaguar : Animal
{
public override string Name { get { return "Jaguar"; } }
public Jaguar()
{
this.Capabilities = new AnimalCapability[] { AnimalCapability.Run, AnimalCapability.Devour };
}
}
public class Owl : Animal
{
public override string Name { get { return "Owl"; } }
public Owl()
{
this.Capabilities = new AnimalCapability[] { AnimalCapability.Fly };
}
}
使用它就像这样简单:
List<Animal> animals = new List<Animal>();
animals.Add(new Jaguar());
animals.Add(new Owl());
animals.ForEach(animal =>
{
if (animal.HasCapability(AnimalCapability.Fly))
{
MessageBox.Show(animal.Name + " can fly");
}
else
{
MessageBox.Show(animal.Name + " can't fly");
}
});