我对通用继承方法有疑问。
比如说我有一个基本管理器类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);
}
它们都具有完全相同的方法,但具有不同的“内容”。
答案 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>
就可以了。