访问子类属性

时间:2013-09-08 13:31:04

标签: c#

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

我如何进入该物业?

  

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

课程结构:

动物 - >鸟 - >猫头鹰

猫头鹰拥有属性CanFly

3 个答案:

答案 0 :(得分:1)

我从该屏幕截图中了解到,您的animalObjOwl的一个实例,我认为该类继承自Bird,并且此类继承自AnimalAnimal有一个名为CanFly的属性。

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

animalObj.CanFly

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

答案 1 :(得分:1)

如果您拥有Animal的实例,并且Owl只有OwlCanFly属性为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");
    }
});