2010-01-10 3 views
1

jQuery에서 어떻게 할 것인가와 같은 CSS 클래스를 처리 할 확장 메서드를 작성했습니다. ASP.NET을 사용하고 있기 때문에 프레임 워크에는 두 가지 확장 점이 있습니다.어떤 오버로드가 호출되며 어떻게됩니까?

첫 번째 System.Web.UI.WebControls.WebControl

public static bool HasCssClass(this WebControl control, string className) 
public static void AddCssClass(this WebControl control, string className) 
public static void RemoveCssClass(this WebControl control, string className) 

이고 두 번째는 System.Web.UI.IAttributeAccessor

여기 딜레마 'WebControl의 CssClass 속성 케이 그 함께 할 수있다
public static bool HasCssClass(this IAttributeAccessor accessor, string className) 
public static void AddCssClass(this IAttributeAccessor accessor, string className) 
public static void RemoveCssClass(this IAttributeAccessor accessor, string className) 
이다

IAttributeAccessor 인터페이스를 통해 속성에 액세스 할 때 그에 따라 적절히 반영되는 것 같습니다. 즉

WebControl c; 
c.CssClass = "hello-world"; 
Debug.Assert(((IAttributeSelector)c).GetAttribute("class") != "hello-world"); 

나는 일부 .NET 반사경 주변에 파고했고, 주장이 개최 결론에 도달했다. 두 가지 다른 방식으로 같은 기본 HTML 속성 class을 수정할 수 있습니다. 따라서 오버로드를 사용하는 내 문제, 또는 오히려 어떤 오버로드가 컴파일러 사용을합니까?

이제 System.Web.UI.WebControls.WebControlSystem.Web.UI.IAttributeAccessor을 구현하므로 과부하가 사용되는 이유는 무엇입니까? 아니면 둘 사이에 통화가 모호한가요?

필자는 항상 컴파일러/런타임이 다른 유형보다 한 유형을 선택하는 거리를 계산했다고 상상한다.

WebControl까지의 거리가 엄밀히 말하자면, 짧은 때문에 WebControl 과부하를 부를 것이다 IAttributeAccessor를 구현 WebControl에서 파생되는 TextBox을 말한다.

나는 이것에 관해 MSDN에 약간의 물건을 발견했다. 그러나 그것은 그것이보다 좋거나 나쁘다는 것이 무엇을 의미하는지 말하지 않는다. 그래서 전화 할 때 무슨 일이 생길까요?

TextBox c; 
c.AddCssClass("hello-world"); 

?

편집

나는 여전히 대부분의 경우를 설명하고 우리 팀에 다른 개발자 덜 혼란 스러울 것 becuase 대신 HtmlControl하는은 IAttributeAccessor을 변경 끝났다.

사실 IntelliSense는 가능한 오버로드로 표시되지만 실제로는 하나만 가능합니다.

답변

3

당신은 거의 거기에 있었고, 대신 7.4.2.3 섹션을 원했습니다. "더 나은 변환"이었습니다. 그것은 "거리"라는 변환의 문제가 아닙니다. 합니다 (C# 3 사양에서 이것은 당신이 관심이 경우 7.4.3.4입니다.)

WebControl-TextBox에서 변환, IAttributeSelector로의 전환보다 더 나은 이유는

경우 암시 적 변환에서 T1에서 T2가 존재하며 T2에서 T1으로의 암시 적 변환이 없습니다. 이 존재하면 C1이 더 나은 변환입니다.

WebControl에서 IAttributeSelector으로의 암시 적 변환이 있지만 그 반대는 아닙니다.

전환율이 어느 정도인지 알았으므로 참조 된 섹션을 적용하여 WebControl의 과부하를 결정할 수 있습니다. 이것은 쉽게 물론 테스트 응용 프로그램을 시연 할 수 있습니다

using System; 

public interface IFoo {} 
public class Bar : IFoo {} 
public class Baz : Bar {} 

public static class Extensions 
{ 
    public static void Extension(this IFoo foo) 
    { 
     Console.WriteLine("Extension(IFoo)"); 
    } 

    public static void Extension(this Bar bar) 
    { 
     Console.WriteLine("Extension(Bar)"); 
    } 
} 

public class Test 
{ 
    static void Main() 
    { 
     Baz b = new Baz(); 
     b.Extension(); 
    } 
} 

이 인쇄 "확장 (바)"- 실제 경우에 WebControl을 통해 확장 메서드에 해당.

물론 b에서 IFoo으로 캐스팅하면 컴파일러가 다른 오버로드를 적용 할 수 없다는 것을 알기 때문에 오버로드 인쇄 "확장 (IFoo)"이 선택됩니다. 오버로드는 일 뿐이며 컴파일시 수행되는 (C# 4에는 dynamic은 제외)을 기억하십시오.

+0

나는 그것을 얻었지만, 분명히하기 전에 몇 번이나 적어 두어야한다고 생각한다. T1은 WebControl이고 T2는 IAttributeAccessor이고 S는 TextBox이며 둘 다 암시 적으로 변환되지만 IAttributeAccessor에는 WebControl에 대한 암시 적 변환이 없습니다. T1이 유형입니다. 이것에 대한 공식적인 이름이 있는지 아십니까? 그리고 늘 그렇듯이 나는이 모든 질문에 답할 시간을 찾는 방법에 놀라움을 금치 못했습니다;) 고마워요! 그러나 T1이 T2이지만 T2가 T1이 아니라면 거리를 의미하지 않습니까? 거리가 같을 때, 모호성을 해결하는 규칙이 있지만 거리의 주장은 어느 정도 사실입니다. –

+0

@ 존 : "거리"비유와 직감을 사용하면 꽤 멀어 질 수 있다고 생각합니다.하지만 스펙에서 용어를 다루는 것을 선호합니다. 그들은 쉽게 추론 할 수 있으며, 의사 소통에 대한 일반적인 기준입니다. "거리"비유가 작동하지 않는 구석이있을 것입니다. 정식 이름은 무엇을위한 것인가? 정확히? 과부하 해결, "더 나은"함수 멤버를 결정하고 "더 나은"변환을 결정합니까? –

+0

만약 이것이 과부하 해결을 잘 다루는 것이라면, 나는 형식 이론의 관점에서 생각하고있었습니다. 자바와 같은 정적 인 유형의 프로그래밍 언어에 대해 동일한 프린시 페에 의존 할 수 있습니까? –

관련 문제