0

예를 들어 (그리고 내 질문의 이유), Windows.XAML.Media.Transform 클래스는 ILDASM에 표시된 WinMD 정보에서 볼 수있는 한 정의 된 생성자가 없습니다.WinRT에서 기본 .Ctor의 가시성은 무엇입니까?

하지만 그 클래스에서 파생하려고하면 C# 프로젝트에서 컴파일러가 아닌 생성자를 찾을 수 있다고 불평합니다.

이것은 나에게 이것은 생성자의 숨겨진 가시성 결과 일 수 있습니다.

민간 (또는 내부) 생성자를 선언하는 C#에서 동일한 효과를 얻을 수 있지만 선언해야합니다. 그렇지 않으면 공용 생성자가 컴파일러에서 만들어지고 클래스가 실제로 파생됩니다.

힌트가 있습니까?

+0

날이 살펴보고 이야기의 재미 부분입니다.com/questions/3763612/default-visibility-for-c-sharp-classes-and-members-fields-methods-etc – turibbio

답변

3

여기서 생각한 것은 클래스가 내부 (기본) 생성자, 공개 생성자를 명시 적으로 선언했기 때문에 개발자가 정의 어셈블리 내에서 클래스를 상속 할 수 있다고 생각합니다. 의회 외부에있는 다른 모든 사람들은 수업에서 물려받을 수 없게됩니다.

+0

좋아, 그럼 내 질문은 :이 정보가 메타 정보로 전달되지 않는 이유는 무엇입니까? WinMD 파일에 클래스의 도달 가능한 세부 정보 만 표시됩니까? 감사합니다 –

+1

@ NicolòCarandini : .winmd 파일은 WinRT 구성 요소의 게시 된 표면을 보여 주므로이 경우에는 공용 멤버 만 볼 수 있습니다. http://msdn.microsoft.com/en-us/library/windows/apps/hh755822.aspx – Mithrandir

+0

공용 클래스 및 보호 된 ("패밀리") 멤버. protected 클래스의 멤버는 "public"API의 일부이기도합니다. –

0

WinRT는 COM 개념을 발전시킨 것으로, 우리가 이진 구성 요소에 대해 이야기하고 소스 상속에 대해 이야기하지 않는 것과는 아주 다른 이야기입니다. 이 ABI 이야기에서 가장 중요한 것은 사용할 수있는 구성 요소의 유일한 것들이 인터페이스를 통해 노출되는 것들이라는 것입니다. 생성자를 인터페이스에 정의하거나 정적으로 지정할 수 없기 때문에 WinRT는 이러한 인터페이스도 필요합니다.

WinRT 구성 요소의 C# 뷰는 언어 프로젝션의 아티팩트이며 구성 요소의 실제 레이아웃이 아닙니다. 거기에 무엇이 있는지 완전히 이해하려면 WinRT API를 작성하는 데 사용되는 라이브러리 인 기본 라이브러리 WRL을 사용하여 C++의 구성 요소를 살펴보아야합니다.

생성자는 WinRT 구성 요소의 팩토리 인터페이스에 대한 투영입니다 (WinRT 구성 요소가 COM에 존재하지 않았으므로 WinRT에 익숙하지 않은 유사한 처리 방법이 있음).

C# 개체에서 "새로 만들기"를 선택하면 해당 구성 요소와 연결된 팩터 리 구성 요소가 먼저 만들어집니다. 그런 다음 팩토리가 객체를 만듭니다. 이런 이유로 생성자 질문은 팩토리 구성 요소의 관점에서보아야하며 구성 요소의 관점에서 보지 않아야합니다 (기본 구현에 존재하지만 실제로 구성 요소의 내용은 바이너리 계약 인 ABI).

다른 옵션이 있습니다. 1. 팩토리가없고 구성 요소를 만들 수 없습니다. Factory 인터페이스가 내부 인터페이스 인 경우 사용할 수 없으며 객체를 만들 수 없습니다. 2. 팩토리가 존재하고 기본 생성자를 노출합니다. C#에서는 객체를 새로 만들 수 있습니다. 3. 사용자 정의 팩토리가 존재하며 사용자 정의 생성자 (부엉 매개 변수)를 노출합니다.

ITransformFactory는 비공개이며 내가 본 행동을 설명한다고 생각합니다.

WinRT 어 그리 게이션은 이진 상속 및 버전 관리를 제공하는 방식이므로이 주제가 훨씬 더 많습니다. 그러나이 주제는 또 다른 (매우 긴) 이야기입니다. HTTP : // 유래

아직도 파고, 그리고 멈추지 않을 것입니다 결코, 그것은 우리의 일 :) 도움이된다면

+0

안녕하세요, Raf, 죄송 합니다만 귀하의 말이 맞다고 생각하지 않습니다. "ITransformFactory는 비공개이며 여기에서 당신이 본 행동을 라고 설명합니다." 인터페이스가 개인적인 이유는 내부적으로 설명했기 때문에 내부적으로 사용되기 때문입니다. 모든 인터페이스는 비공개입니다! 예를 들어 인스턴스화 할 수있는 Windows.XAML.Media.RotateTransform 클래스를 살펴보십시오. Ctor가 있고 IRotateTransform도 비공개입니다. 그래서 Mithrandir가 포인트를 얻었고 대답은 링크 된 문서에 있다고 생각합니다. –

+0

구성원 액세스 가능성 및 표시 유형 : 개인 참조 클래스, 인터페이스 또는 대리인에서 공용 액세스 가능성이있는 멤버라도 메타 데이터에 멤버가 방출되지 않습니다. public ref 클래스에서는 소스 코드에서 액세스 가능성과 상관없이 메타 데이터 멤버의 가시성을 제어 할 수 있습니다. 표준 C++에서와 같이 최소한의 권한 원칙을 적용하십시오. 절대적으로 필요한 경우가 아니면 회원을 메타 데이터에 표시하지 마십시오. –

+0

나는 당신이 주요 포인트를 놓쳤다 고 믿는다 : 공장은 생성자에게 투영된다. 이것은 C#에서 볼 수있는 생성자가 생성자가 아니라 제어 할 수없는 예상 된 팩토리라는 것을 의미합니다. 이것이 가시성이나 공장이 내부적으로 구축 된 방식에 의해 발생하는지는 중요하지 않습니다. (필자는 아직이 지점을 파고 있습니다). – raf