Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- public interface IRepository<out T>
- {
- T Get();
- }
- public interface IContravariantRepository<in T>
- {
- void Add(T item);
- }
- public class Animal
- {
- public string Name { get; set; }
- }
- public class Dog : Animal
- {
- public string Breed { get; set; }
- }
- public class AnimalRepository : IRepository<Animal>, IContravariantRepository<Animal>
- {
- public Animal Get()
- {
- Console.WriteLine("Getting an animal from the repository.");
- return new Animal { Name = "Fido" };
- }
- public void Add(Animal item)
- {
- Console.WriteLine("Adding an animal to the repository.");
- }
- }
- public class DogRepository : IRepository<Dog>, IContravariantRepository<Dog>
- {
- public void Add(Dog item)
- {
- Console.WriteLine("Adding an animal to the repository.");
- }
- public Dog Get()
- {
- Console.WriteLine("Getting a dog from the repository.");
- return new Dog { Name = "Buddy", Breed = "Golden Retriever" };
- }
- }
- internal class Program
- {
- public static void UseAnimalRepository(IRepository<Animal> repository)
- {
- var animal = repository.Get();
- Console.WriteLine("Used repository to get an animal: " + animal.Name);
- }
- public static void UseDogRepository(IContravariantRepository<Dog> repository)
- {
- repository.Add(new Dog { Name = "Spot", Breed = "Dalmatian" });
- Console.WriteLine("Used repository to add a dog.");
- }
- public static void Main()
- {
- AnimalRepository animalRepository = new AnimalRepository();
- DogRepository dogRepository = new DogRepository();
- Console.WriteLine("Using Animal Repository:");
- UseAnimalRepository(animalRepository);
- Console.WriteLine("\nUsing Dog Repository:");
- UseAnimalRepository(dogRepository);
- Console.WriteLine("\nUsing Dog Repository (Contravariance):");
- UseDogRepository(dogRepository);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment