public static void Main()
var trainer = new Trainer(new Dog());
Console.WriteLine(trainer.Train());
var dogTrainer = new DogTrainer(new Dog());
Console.WriteLine(dogTrainer.Train());
var getTrainer = new Func<Trainer>(() => new DogTrainer(new Dog()));
var funcTrainer = getTrainer();
Console.WriteLine(funcTrainer.Train());
var getITrainer = new Func<ITrainer>(() => new DogTrainer(new Dog()));
var funcITrainer = getITrainer();
Console.WriteLine(funcITrainer.Train());
var getTrainerWithNoInterface = new Func<Trainer>(() => new DogTrainerWithNoInterface(new Dog()));
var funcTrainerWithNoInterface = getTrainerWithNoInterface();
Console.WriteLine(funcTrainerWithNoInterface.Train());
var getITrainerWithNoInterface = new Func<ITrainer>(() => new DogTrainerWithNoInterface(new Dog()));
var funcITrainerWithNoInterface = getITrainerWithNoInterface();
Console.WriteLine(funcITrainerWithNoInterface.Train());
public class DogTrainer : Trainer, ITrainer
public DogTrainer(IAnimal animal)
public new string Train()
return $"Speak Ubu, Speak : {Animal.Speak()}";
public class DogTrainerWithNoInterface : Trainer
public DogTrainerWithNoInterface(IAnimal animal)
public new string Train()
return $"Speak Ubu, Speak : {Animal.Speak()}";
public class Trainer : ITrainer
internal readonly IAnimal Animal;
public Trainer(IAnimal animal)
public interface ITrainer
public class Dog : IAnimal