[Effective C#] 아이템 26: 제네릭 인터페이스와 논제네릭 인터페이스를 함께 구현하라
C# 카테고리의 다른 글
새로운 라이브러리를 개발할 때에 제네릭 타입뿐 아니라 고전적인 방식도 함께 지원하면 라이브러리의 활용도를 좀 더 높일 수 있다.
제네릭이 아닌 방식도 지원하려면 다음 세가지에 대해서 논제네릭 방식을 지원해야한다.
- 클래스와 인터페이스
- public 속성
- serialize 대상이 되는 요소
Equals() 메서드 내에서 IEquatable.Equals()를 호출하도록 하기
IEquatable
// class MyClass : IEquatable<MyClass>
public override bool Equals(object obj)
{
if (obj.GetType() == typeof(MyClass))
return this.Equals(obj as MyClass);
else
return false;
}
위 코드의 5번째 줄에서 obj의 타입을 체크하는 이유는 obj가 Name을 상속한 파생 클래스일 경우에 타입이 다른데도 true가 될 수 있기 때문이다.
주의) Equals() 메서드를 override 했을 경우에는 GetHashCode() 메서드도 override 해야한다.
IEquatable<T>를 구현했다면 operator==와 operator!=도 함께 구현 하기
// class MyClass : IEquatable<MyClass>
public static bool operator ==(MyClass left, MyClass right)
{
if (left == null)
return right == null;
return left.Equals(right);
}
public static bool operator !=(Name left, Name right)
{
if (left == null)
return right != null;
return !left.Equals(right);
}
IComparable를 구현했다면 IComparable와 operator도 함께 구현하기
마찬가지로 선후관계를 확인하기 위해 IComparable
제네릭이 아닌 IComparable과 operator(<, >, <=, >=)도 함께 구현하는 것이 좋다.
이에 대한 내용은 위의 item20에서 자세히 다뤘다.
댓글남기기