Krzysztof Cwalina와 Brad Abrams의 Framework Design Guidelines 2nd Ed.에서 확장 멤버에 대한 섹션을 읽었으며이를위한 예제를 찾지 못했습니다. 내 질문은 F # 라이브러리의 수퍼 클래스와 하위 클래스에 관한 것이지만 모든 .NET 언어와 관련이 있다고 생각합니다.확장 메서드 디자인 지침 : 같은 메서드 이름이 하위 클래스와 수퍼 클래스에서 동일해야합니까?
F #에는 수퍼 유형 Expr
과 서브 유형 Expr<'a>
의 두 가지 유형이 있습니다. 여기서 후자는 전자의 유형화 된 버전에 대한 래퍼입니다. 인용 형식에 사용되는 유형입니다. 나는 더 나은 디자인이 될 것이다, 그들을 평가하기위한 이러한 유형에 대한 확장 메서드를 정의하고 싶다면
:
- 수행 F 번호의 파워팩으로 수행하고 다른 이름
Expr<'a>
에Expr
에EvalUntyped() : Expr -> obj
및Eval() : Expr<'a> -> 'a
에 정의 된 메소드 . - 유형을 소유하고 동일한 이름을 사용하는 경우 수행 할 작업에 더 가깝게 수행하십시오. 여기서 수퍼 유형의 메소드는 가상으로 간주 될 수 있으며, 서브 유형의 메소드는 메소드를 대체하는 것으로 간주 될 수 있습니다. 슈퍼 가상 메소드). 즉
Eval() : Expr -> obj
은Expr
이고Eval() : Expr<'a> -> 'a
은Expr<'a>
입니다.
두 번째 옵션이 나에게 맞는 것 같지만 설계 지침이 무엇이든간에 따라야합니다. 권위있는 우선 순위가 있습니까 (PowerPack에서 "잘못"했다고 가정)?
권장 사항이 무엇인지 알 수 없습니다. 한가지 주목해야 할 것은'Eval'이 표준 가상 메소드라면 파생 된 타입은 타입을 변경할 수 없다는 것입니다. (인수는'Expr'이어야합니다 .' obj'에서'a'로 결과를 변경하는 것은 허용되지 않습니다. 그러나 소리가 될 것입니다.) –
아, 좋은 지적이다. 더 좋은 비유는'IEnumerable.GetEnumerator()'와'IEnumerable <'a> .GetEnumerator()'입니다. –