2011-07-03 5 views
5

Krzysztof Cwalina와 Brad Abrams의 Framework Design Guidelines 2nd Ed.에서 확장 멤버에 대한 섹션을 읽었으며이를위한 예제를 찾지 못했습니다. 내 질문은 F # 라이브러리의 수퍼 클래스와 하위 클래스에 관한 것이지만 모든 .NET 언어와 관련이 있다고 생각합니다.확장 메서드 디자인 지침 : 같은 메서드 이름이 하위 클래스와 수퍼 클래스에서 동일해야합니까?

F #에는 수퍼 유형 Expr과 서브 유형 Expr<'a>의 두 가지 유형이 있습니다. 여기서 후자는 전자의 유형화 된 버전에 대한 래퍼입니다. 인용 형식에 사용되는 유형입니다. 나는 더 나은 디자인이 될 것이다, 그들을 평가하기위한 이러한 유형에 대한 확장 메서드를 정의하고 싶다면

:

  1. 수행 F 번호의 파워팩으로 수행하고 다른 이름 Expr<'a>ExprEvalUntyped() : Expr -> objEval() : Expr<'a> -> 'a에 정의 된 메소드 .
  2. 유형을 소유하고 동일한 이름을 사용하는 경우 수행 할 작업에 더 가깝게 수행하십시오. 여기서 수퍼 유형의 메소드는 가상으로 간주 될 수 있으며, 서브 유형의 메소드는 메소드를 대체하는 것으로 간주 될 수 있습니다. 슈퍼 가상 메소드). 즉 Eval() : Expr -> objExpr이고 Eval() : Expr<'a> -> 'aExpr<'a>입니다.

두 번째 옵션이 나에게 맞는 것 같지만 설계 지침이 무엇이든간에 따라야합니다. 권위있는 우선 순위가 있습니까 (PowerPack에서 "잘못"했다고 가정)?

+2

권장 사항이 무엇인지 알 수 없습니다. 한가지 주목해야 할 것은'Eval'이 표준 가상 메소드라면 파생 된 타입은 타입을 변경할 수 없다는 것입니다. (인수는'Expr'이어야합니다 .' obj'에서'a'로 결과를 변경하는 것은 허용되지 않습니다. 그러나 소리가 될 것입니다.) –

+0

아, 좋은 지적이다. 더 좋은 비유는'IEnumerable.GetEnumerator()'와'IEnumerable <'a> .GetEnumerator()'입니다. –

답변

1

확실한 답변이 없을 수 있습니다.

  1. 다른 개발자가 이미 F # 및 공식 확장에 작업 것과 일치 스타일을 유지하려면 : 당신이 진정으로 생각하지 않는 단, F # PowerPack에 나는 두 가지 이유 때문에 자신의 스타일을 따라 것 "잘못된"디자인을 얻었다 .
  2. 두 메소드의 리턴 유형이 중요하므로 더 명확하게 차이점을 표시하십시오.

Tomas에 대한 회신에서의 비유는 좋은 생각이지만,이 코드를 사용하는 다른 개발자는 디자인에 많은 관심을 기울이지 않을 수도 있습니다. 공식 스타일을 유지하고 의도를 분명하게 표현하는 것이 가장 좋습니다.

+0

좋은 점 David, thanks. Framework Design Guidelines는 더 나은 디자인을 위해서조차도 일관성을 유지할 수 없음을 경고합니다. PowerPack 디자인이 처음 만났을 때 혼란 스럽다는 것을 알았고, 입력 된 인용문과 형식이 지정되지 않은 인용문간에 갈 때 다시 문제를 일으켰습니다. –