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.WebControl
은 System.Web.UI.IAttributeAccessor
을 구현하므로 과부하가 사용되는 이유는 무엇입니까? 아니면 둘 사이에 통화가 모호한가요?
필자는 항상 컴파일러/런타임이 다른 유형보다 한 유형을 선택하는 거리를 계산했다고 상상한다.
는 WebControl
까지의 거리가 엄밀히 말하자면, 짧은 때문에 WebControl
과부하를 부를 것이다 IAttributeAccessor
를 구현 WebControl
에서 파생되는 TextBox
을 말한다.
나는 이것에 관해 MSDN에 약간의 물건을 발견했다. 그러나 그것은 그것이보다 좋거나 나쁘다는 것이 무엇을 의미하는지 말하지 않는다. 그래서 전화 할 때 무슨 일이 생길까요?
TextBox c;
c.AddCssClass("hello-world");
?
편집
나는 여전히 대부분의 경우를 설명하고 우리 팀에 다른 개발자 덜 혼란 스러울 것 becuase 대신 HtmlControl하는은 IAttributeAccessor을 변경 끝났다.
사실 IntelliSense는 가능한 오버로드로 표시되지만 실제로는 하나만 가능합니다.
나는 그것을 얻었지만, 분명히하기 전에 몇 번이나 적어 두어야한다고 생각한다. T1은 WebControl이고 T2는 IAttributeAccessor이고 S는 TextBox이며 둘 다 암시 적으로 변환되지만 IAttributeAccessor에는 WebControl에 대한 암시 적 변환이 없습니다. T1이 유형입니다. 이것에 대한 공식적인 이름이 있는지 아십니까? 그리고 늘 그렇듯이 나는이 모든 질문에 답할 시간을 찾는 방법에 놀라움을 금치 못했습니다;) 고마워요! 그러나 T1이 T2이지만 T2가 T1이 아니라면 거리를 의미하지 않습니까? 거리가 같을 때, 모호성을 해결하는 규칙이 있지만 거리의 주장은 어느 정도 사실입니다. –
@ 존 : "거리"비유와 직감을 사용하면 꽤 멀어 질 수 있다고 생각합니다.하지만 스펙에서 용어를 다루는 것을 선호합니다. 그들은 쉽게 추론 할 수 있으며, 의사 소통에 대한 일반적인 기준입니다. "거리"비유가 작동하지 않는 구석이있을 것입니다. 정식 이름은 무엇을위한 것인가? 정확히? 과부하 해결, "더 나은"함수 멤버를 결정하고 "더 나은"변환을 결정합니까? –
만약 이것이 과부하 해결을 잘 다루는 것이라면, 나는 형식 이론의 관점에서 생각하고있었습니다. 자바와 같은 정적 인 유형의 프로그래밍 언어에 대해 동일한 프린시 페에 의존 할 수 있습니까? –