通用继承方法

时间:2015-04-07 01:36:19

标签: c# generics inheritance

我对通用继承方法有疑问。

比如说我有一个基本管理器类ListManager:

 public class ListManager<T>
{
    private List<T> m_list;

    public ListManager()
    {
        m_list = new List<T>();
    }

    public int Count
    {
        get { }
    }

    public void Add(T aType)
    {
    }

    public bool DeleteAt(int anIndex)
    {
    }

    public string[] ToStringArray()
    {
    }

    public List<string> ToStringList()
    {
    }

    public bool CheckIndex(int index)
    {
    }
}

然后继承上面的List管理器类的Animal manager类:

public class AnimalManager : ListManager<Animal>
{
    private List<Animal> AnimalList; //list

    public AnimalManager()
    {
        AnimalList = new List<Animal>();
    }

    public void Add(Animal animal)   // Exactly the same as base class method but with different method "content".
    {
        animal.Id = ++animalCounter; //increases the id by one.
        AnimalList.Add(animal);
    }

    public bool IsIndexValid(int index)
    {
        return ((index >= 0) && (index < AnimalList.Count));
    }

    public Animal GetElementAtPosition(int index)
    {
        if (IsIndexValid(index))
            return AnimalList[index];
        else
            return null;
    }

    public int ElementCount
    {
        get { return AnimalList.Count; }
    }

    public bool DeleteAt(int anIndex)
    {
        return true;
    }
} 

如何继承ListManager的方法?它需要继承的方法,但方法内部有不同的“内容”。

我知道只要一个类继承了另一个类,它们就会继承它们的基类所拥有的一切,但是如果每个管理类处理不同的列表框但具有完全相同的方法头,我该怎么办呢。

例如,每个经理类都有Add

public void Add(T aType)
{
}

但是我的动物经理需要添加到动物清单中:

public void Add(Animal animal)
{
    AnimalList.Add(animal);
}

我的员工经理需要添加到员工:

public void Add(Employee employee)
{
    Employeelist.Add(employee);
}

它们都具有完全相同的方法,但具有不同的“内容”。

3 个答案:

答案 0 :(得分:2)

您可以将基类方法设为虚拟,然后在派生类中覆盖它们:

public class ListManager<T>
{
    private List<T> m_list;

    public ListManager()
    {
        m_list = new List<T>();
    }

    public virtual void Add(T aType)
    {
    }
}

public class AnimalManager : ListManager<Animal>
{
    private List<Animal> AnimalList; //list
    private int animalCounter; //variable

    public AnimalManager()
    {
        AnimalList = new List<Animal>();
    }

    public override void Add(Animal animal)
    {
        animal.Id = ++animalCounter; //increases the id by one.
        AnimalList.Add(animal);
    }
}

public class Animal
{
    public int Id { get; set; }
}

如果您的基类没有做太特别的事情,您可能只想扩展现有的List<T>

public class AnimalManager : List<Animal>
{
    private int animalCounter;

    public new void Add(Animal animal)
    {
        animal.Id = ++animalCounter;

        base.Add(animal);
    }
}

答案 1 :(得分:1)

为什么你有两个名单?使用基类的通用m_list,使其受到保护,您不必重新实现任何内容。在派生类中(假设它们除了仅实现特定的泛型特化之外还执行某些操作),请使用m_list而不是当前的AnimalList等等。

答案 2 :(得分:1)

完成后的第一堂课完全符合你的要求:

public class ListManager<T>
{
    private List<T> m_list;

    public ListManager()
    {
        m_list = new List<T>();
    }

    public int Count
    {
        get {return m_list.Count; }
    }

    public void Add(T aType)
    {
        m_list.add (aType);
    }

    public bool DeleteAt(int anIndex)
    {
        m_list.DeleteAt (anIndex);
    }

    public string[] ToStringArray()
    {

    }

    public List<string> ToStringList()
    {

    }

    public bool CheckIndex(int index)
    {
    }

    }
}

现在您可以按如下方式使用该类:

ListManager <Person> plm = new ListManager <Person>();
plm.add (new Person ());
plm.Count ();
// and so on...

动物类也一样。

事实上,如果您不需要列表中的任何功能,那么List<Animal>List<Person>就可以了。