다음 본문은 도서 이펙티브 C# (빌 와그너)에서 나오는 주제를 다룹니다.
제네릭과 함께 여러개의 오버로드된 메서드가 있는경우
컴파일러가 어느 메서드를 우선 선택하는지를 알아둘 필요가 있다.
부모 형식 vs 제네릭 형식 우선순위
- Parent 클래스를 상속받는 DerivedA 클래스 객체가 있을 때,
매개변수 형식으로 Parent를 취하는 메서드와 제네릭 T를 취하는 메서드가 오버로딩 되어있다.
두 메서드 중 어느 것이 호출될까?
public abstract class Parent
{
public double Mass { get; set; }
public string Name { get; set; }
}
public class DerivedA : Parent{ }
public class MyTest
{
public void MyMethod()
{
DerivedA a = new DerivedA();
Print(a);
}
public void Print<T>(T p)
{
Debug.Log("제네릭 T");
}
public void Print(Parent p)
{
Debug.Log("부모");
}
}
- 정답은 제네릭 메서드이다.
부모를 형식으로 취하는 메서드의 경우 암시적 타입 캐스팅을 수행해야하지만,
제네릭은 바로 T타입을 DerivedA 타입으로 인식하고 실행가능하기 때문이라고 함.
즉, 베이스 클래스에 대해서 제네릭을 특화하려고 시도해봤자 T가 우선권을 가져가기 때문에 의미가 없다는 소리.
특화를 하고 싶다면 모든 파생 클래스에 대해서 특화를 해야한다.
타입이 몇개 없다면 차라리 런타임 중에 타입을 is로 확인하여 분기시키는게 나을 수도 있다.
결론
- 베이스 타입보다는 제네릭 타입 메서드가 우선적으로 선택된다.
'🌍 C# Study > 이펙티브 C#' 카테고리의 다른 글
[26] 제네릭 인터페이스와 논제네릭 인터페이스를 함께 구현하라 (0) | 2021.04.28 |
---|---|
[25] 타입 매개변수로 인스턴스 필드를 만들 필요가 없다면 제네릭 메서드를 정의하라 (0) | 2021.04.27 |
[23] 타입 매개변수에 대해 메서드 제약 조건을 설정하려면 델리게이트를 활용하라 (0) | 2021.04.27 |
[22] 공변성과 반공변성을 지원하라 (0) | 2021.04.27 |
[21] 타입 매개변수가 IDisposable을 구현한 경우를 대비하여 제네릭 클래스를 작성하라 (0) | 2021.04.27 |