Generic Constraints
Generic parameter에 대한 제한자를 설정한다.
Generic class 선언할 때에 꼭 reference type의 class만 사용이 필요한 경우가 있다.
이를 위해서 Generic Parameter 를 <T>로 가정할 때에, T에 대한 제한자를 generic constraint라고 한다.
class MyGenericClass<T> where T : class
{
}
위의 where T : class 선언으로 인해 T는 reference type의 클래스만 입력받을 수 있다.
class 뿐만 아니라 제한자는 class, struct , IEntity 와 같이 될 수 있다.
추가 적으로 generic class는 new() 를 사용하지 못한다. 이를 가능하기 위해 제한자에 new() 를 추가할 수 있다.
{
}
제한자는 명시적인 클래스이름을 넣을 수도 있다. { } class MyGenericClass<T> where T : MyCompany, struct, IEntity, new { }
Generic Covriance (공변수) generic covariance(공변수) 단어의 의미대로 공통의 변수에 대한 generic을 명시하는 지정자이다. IRepository <out T> <out T> 지정된 클래스의 함수는 T를 매개변수로 갖으면 안되고, 반환자에는 사용해도 된다.
Generic Contravriance generic contravariance 는 covariance 의 반대적인 지정자이다. IRepository <in T>
<in T> 지정된 클래스의 함수는 매개변수를 T로 받을 수 있다. 반대로 반환자에는 사용하면 안된다. class Person class Employee : Person class Manager : Employee
covariance 와 contravariance를 사용할 때에는 IReadOnlyRepository , IWriteOnlyRepository 와 같이 각각의 interface를 선언하고 둘을 모두 사용할 때에 둘을 상속하는 IRepository 로 만들어서 사용한다.
public interface IReadOnlyRepository<out T> : IDisposable
{
T FindById(int id);
IQueryable<T> FindAll();
}
public interface IWriteOnlyRepostiroy<in T> : IDisposable
{
void Add(T newEntity);
void Delete(T entity);
int Commit();
}
public interface IRepository<T> : IWriteOnlyRepostiroy<T>, IReadOnlyRepository<T>
{
}