나는 C#으로 통합/시스템 테스트를 작성을위한 작은 도서관을 구현하면서 와서 문제에 대한 당신의 의견에 관심이 있어요. 라이브러리는 2 부분으로 구성됩니다. 테스트 제작 API 및 테스트 런타임 API입니다. 테스트 작성자는 제작 API를 사용하여 테스트 계획 프로토 타입을 작성합니다. 런타임은 프로토 타입을 가져 와서 프로토 타입의 런타임 표현을 으로 만들고 실행할 수 있습니다.일부 클래스의 인스턴스를 사전 키로 사용하지 않도록 지정하는 방법은 무엇입니까?
라는 이름의 클래스를 테스트 할 수 RuntimeTestPlanBuilder 나는 전체 런타임 객체 모델 클래스의 Equals 메서드를 재정의했다. 이로 인해 GetHashCode 메서드도 재정의해야하는 상황이 발생했습니다. 일부 런타임 개체 모델 클래스에 대해 GetHashCode를 구현하는 것은 쉽습니다. 런타임 모델의 일부 클래스는 GetHashCode를 구현하는 컨테이너이기 때문에 런타임이 컨테이너에 항목을 추가 할 수 있으므로 (예 : O (1)에서 해시 코드를 계산할 수 없기 때문에) 힘들고 심지어 불가능했습니다.
은 결과적으로 나 자신이 키와 사전에 그들을 넣어 컨테이너의 사용자를 방지하는 방법을 생각해 냈다. 내가 선택한 솔루션은 GetHashCode 메서드를 재정의하고 예외를 throw하는 것입니다. 이 솔루션은 런타임에만 실패하므로 만족스럽지 않습니다. 게다가 .Net Framework 디자이너가 GetHashCode 메서드를 Object 클래스에두기로 결정한 이유가 궁금합니다. 나는 용기를 합법적 인 사전 키가 아닌 것으로 표시 할 수 없기 때문에 이러한 결정이 내 상황을 초래했다고 생각합니다.닷넷 프레임 워크 설계자에게 더 나은 결정은 Ihashable이라는 인터페이스를 Equals 및 GetHashCode의 두 가지 방법으로 정의하고 일반 사전 항목 유형에 대한 제약 조건을 사용하여 인터페이스를 적용하는 것일 수 있습니다. 이 방법으로 컴파일 타임에 키가 Equals와 GetHashCode를 구현할 수 있습니다. 또한이 인터페이스를 구현하지 않는 클래스는 사전 키로 사용되지 않아야한다는 것을 쉽게 이해할 수 있습니다.
내 질문은 : GetHashCode의 예외를 throw하지 않는 더 나은 솔루션을 제안하여 일부 클래스의 인스턴스를 사전 키로 사용해서는 안된다는 사실을 제안 할 수 있습니까?
감사
문제 클래스에 Equals() 메서드를 어떻게 구현하고 있습니까? GetHashCode()를 구현하는 것은 Equals()를 구현하는 것보다 어렵지 않아야합니다. –
기본적으로 2 개의 컨테이너는 항목 수가 동일하고 같은 위치의 모든 항목이 같으면 동일합니다. – Ikaso
@PieterGeerkens - 내 문항을 특정 컨텍스트가 아닌 좀 더 폭 넓은 맥락에서 생각해보십시오. 일부 클래스를 합법적 인 사전 키가 아닌 것으로 표시하는 방법은 무엇입니까? – Ikaso