Я новичок в мире С#, и я пытаюсь склонить голову к дженерикам. Вот моя текущая проблема:
public Interface IAnimal{
string getType();
}
public Interface IAnimalGroomer<T> where T:IAnimal{
void groom(T);
}
Теперь я хочу иметь словарь, содержащий этих животных. Как мне это сделать? В java я мог бы сделать что-то вроде этого:
HashMap<String,IAnimalGroomer<?>> groomers = new HashMap<>();
Изменить: Вот пример того, что я пытаюсь сделать:
public class Dog : IAnimal
{
public string GetType()
{
return "DOG";
}
public void ClipNails() { }
}
public class DogGroomer : IAnimalGroomer<Dog>
{
public void Groom(Dog dog)
{
dog.ClipNails();
}
}
public class Program
{
private List<IAnimalGroomer<IAnimal>> groomers = new List<IAnimalGroomer<IAnimal>>();
public void doSomething()
{
//THIS DOESN"T COMPILE!!!!
groomers.Add(new DogGroomer());
}
}
ИЗМЕНИТЬ Я думаю, что мои намерения были непонятны в первоначальном посте. Моя конечная цель - сделать AnimalGroomerClinic, который использует различные типы IAnimalGroomers. Тогда владельцы животных могут опустить животных в клинику, и клиника может решить, какой грумер должен заботиться о животном:
public class AnimalGroomerClinic
{
public Dictionary<String, IAnimalGroomer> animalGroomers = new Dictionary<String,IAnimalGroomer>();
public void employGroomer(IAnimalGroomer groomer){
animalGroomers.add(groomer.getAnimalType(), groomer);
}
public void Groom(IAnimal animal){
animalGroomers[animal.getAnimalType()].Groom(animal);
}
}
Я понимаю, что могу сделать это без использования дженериков. Но дженерики позволяют мне написать интерфейс IAnimalGroomer
таким образом, чтобы он был привязан (во время компиляции) к определенному экземпляру IAnimal
. Кроме того, конкретным классам IAnimalGroomer
не нужно выделять их IAnimals
все время, так как дженерики заставили бы реализации иметь дело с одним конкретным видом животных. Я использовал эту идиому раньше в Java, и мне просто интересно, есть ли способ написать ее на С#.
Изменить 2: Много интересного обсуждения. Я принимаю ответ, который указал мне на динамическую отправку комментариев.