泛型继承方法
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>
就可以了。
我对泛型继承方法有疑问。
举个例子,我有一个基本管理器 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>
就可以了。