泛型继承方法

Generic inherited methods

我对泛型继承方法有疑问。

举个例子,我有一个基本管理器 class 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)
    {
    }
}

然后是一个 Animal 管理器 class,它继承了上面的 List 管理器 class:

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 的方法?它需要继承的方法,但方法内部有不同的"content"。

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

例如,每位经理 class 有 Add:

public void Add(T aType)
{
}

但是我的动物管理员需要添加到动物列表中:

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

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

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

他们都有完全相同的方法,但"content"。

您可以使基础 class 方法成为虚拟方法,然后在派生的 class:

中覆盖它们
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; }
}

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

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

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

        base.Add(animal);
    }
}

为什么你有两个列表?使用基础 class 的泛型 m_list,使其受到保护,您将不必重新实现任何东西。在派生的 classes 中(假设他们除了实现特定的通用专业化之外还做了一些事情),使用 m_list 而不是他们当前的 AnimalList 等等。

您的第一个 class 完成后完全符合您的要求:

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)
    {
    }

    }
}

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

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

动物也是如此 class。

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