0

我需要访问名为 CanFly 的对象的属性animalObj,但我不知道如何。

我怎样才能进入该物业?

我测试了animalObj[Owl][Bird][Animal]但没有运气。

类的结构:

动物 --> 鸟 --> 猫头鹰

猫头鹰有属性 CanFly

4

3 回答 3

1

我从该屏幕截图中了解到,您animalObj是 的一个实例Owl,我认为该类继承自Bird,而该类继承自AnimalAnimal有一个名为 的属性CanFly

如果我的假设是正确的,你只需要写:

animalObj.CanFly

假设您已将CanFly可见性设置为public.

于 2013-09-08T13:52:00.973 回答
1

如果您有一个Animal您知道是 an的实例Owl,并且只有Owlproperty CanFly,则必须将该对象强制转换为 anOwl才能访问该属性。

(animalObj as Owl).CanFly

您可以使用运算符检查这是否Animal真的是一个:Owlis

if (animalObj is Owl)
{
    Owl owl = animalObj as Owl;
}

此外,CanFly仅拥有该属性Owl没有多大意义,除非您的问题域专门处理哪些猫头鹰可以飞,哪些不能。

于 2013-09-08T13:56:19.160 回答
1

虽然这个答案是正确的,但它不是很优雅或灵活。我建议在基类中添加能力列表,并在每个继承类中添加适当的能力。

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");
    }
});
于 2013-09-08T14:15:58.700 回答