我需要访问属性CanFly名为animalObj
的对象,但我不知道如何。
我如何进入该物业?
我使用animalObj[Owl][Bird][Animal]
测试但没有运气。
课程结构:
动物 - >鸟 - >猫头鹰
猫头鹰拥有属性CanFly
答案 0 :(得分:1)
我从该屏幕截图中了解到,您的animalObj
是Owl
的一个实例,我认为该类继承自Bird
,并且此类继承自Animal
。
Animal
有一个名为CanFly
的属性。
如果我的假设是对的,你只需要写:
animalObj.CanFly
假设您已将CanFly
可见性设为public
。
答案 1 :(得分:1)
如果您拥有Animal
的实例,并且Owl
只有Owl
且CanFly
属性为Owl
,则您必须投放该对象到(animalObj as Owl).CanFly
进入该物业。
Animal
您可以使用Owl
运算符检查此is
是否真的是if (animalObj is Owl)
{
Owl owl = animalObj as Owl;
}
:
CanFly
此外,仅在Owl
上拥有属性{{1}}没有多大意义,除非您的问题域明确规定哪些猫头鹰可以飞行,哪些不能。
答案 2 :(得分:1)
虽然this answer是正确的,但它不是很优雅或灵活。我建议在基类中添加能力列表,并在每个继承类中添加适当的能力。
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");
}
});