Looking for c# Keywords? Try Ask4Keywords

C# Language Использование общего метода с интерфейсом в качестве типа ограничения.


пример

Это пример того, как использовать общий тип TFood внутри метода Eat для класса Animal

public interface IFood
{
    void EatenBy(Animal animal);
}

public class Grass: IFood
{
    public void EatenBy(Animal animal)
    {
        Console.WriteLine("Grass was eaten by: {0}", animal.Name);
    }
}

public class Animal
{
    public string Name { get; set; }

    public void Eat<TFood>(TFood food)
        where TFood : IFood
    {
        food.EatenBy(this);
    }
}

public class Carnivore : Animal
{
    public Carnivore()
    {
        Name = "Carnivore";
    }
}

public class Herbivore : Animal, IFood
{
    public Herbivore()
    {
        Name = "Herbivore";
    }
    
    public void EatenBy(Animal animal)
    {
        Console.WriteLine("Herbivore was eaten by: {0}", animal.Name);
    }
}

Вы можете вызвать метод Eat следующим образом:

var grass = new Grass();        
var sheep = new Herbivore();
var lion = new Carnivore();
    
sheep.Eat(grass);
//Output: Grass was eaten by: Herbivore

lion.Eat(sheep);
//Output: Herbivore was eaten by: Carnivore

В этом случае, если вы попытаетесь позвонить:

sheep.Eat(lion);

Это будет невозможно, потому что объект-лев не реализует интерфейс IFood. Попытка выполнить вышеупомянутый вызов вызовет ошибку компилятора: «Тип« Carnivore »не может использоваться как параметр типа« TFood »в родовом типе или методе« Animal.Eat (TFood) ». Нет никакого неявного преобразования ссылок из ' Carnivore 'to' IFood '. "