需要帮助来理解多态性

时间:2014-06-27 09:18:15

标签: c# polymorphism

以下课程包括

A - 父类

B - 儿童班

持有人 - 包含A&#39的列表

我想从fatherobjects列表中获取子属性。为什么我不能这样做?或者更好的问题,我该怎么做?

public class A
{
    public int var = 0;
}

public class B : A
{
    public int Property1 { get; set; }
    public int Property2 { get; set; }

    public B()
    {

    }

    public B(B p_B)
    {
        Property1 = p_B.Property1;
        Property2 = p_B.Property2;
    }
}

class Holder
{
    private List<A> m_Objects = new List<A>();

    public void AddObject(A p_Object)
    {
        m_Objects.Add(p_Object);
    }

    public void AddObjectProperty1(B p_B)
    {
        // At this point, m_Objects holds a B-object. And I want to add the value from Property1
        // but there is no Property1 in the A-class so I cant do this. How do I use the base.values from 
        // a statement like the one below?
        int index = m_Objects.FindIndex(item => item.Property1 == p_B.Property1);
        if (index > -1)
            m_Objects.ElementAt(index).Property1 += p_B.Property1;
    }
}


class Program
    {
        static void Main(string[] args)
        {
            // Class to hold the objects
            Holder h = new Holder();

            // Create a B object
            B b = new B();
            b.Property1 = 1;
            b.Property2 = 2;

            // Place a new instance of the B-object in a list of A's
            h.AddObject(new B(b));

            // Add the value from Property1 to the value in the b-object in the a-list.  :P
            h.AddObjectProperty1(b);

            Console.WriteLine(++b.var);
            Console.ReadLine();


        }
    }

2 个答案:

答案 0 :(得分:0)

您可以使用类型转换:

(m_Objects[i] as B).Property1

或者

((B)m_Objects[i]).Property1

答案 1 :(得分:0)

在编译时,编译器无法知道,您只需将B添加到A列表中。因此,无法保证以下查询中的每个item都是B的实例,因此Property1

int index = m_Objects.FindIndex(item => item.Property1 == p_B.Property1);

第一种可能性是在Artyom的答案中施放。但是如果你不是列表中的所有元素都是B,那么这将失败。因此,如果您依赖m_Objects中的所有元素作为B的实例,为什么不使用List<B> m_Objects

如果您需要混合列表,则必须在查询中进行类型检查,以确保在转换之前处理B的实例。

int index = m_Objects.FindIndex(item => (item is B) && (item as B).Property1 == p_B.Property1);

请参阅此DotNetFiddle Example