В WinRT какая видимость по умолчанию.Ctor?

В качестве примера (и причины моего вопроса) класс Windows.XAML.Media.Transform, насколько я могу видеть из информации WinMD, показанной ILDASM, не имеет определенного конструктора.

Но если я пытаюсь наследовать этот класс, в моем проекте на C# компилятор жалуется, что не может быть найден не конструктор.

Мне кажется, что это может быть результатом скрытой видимости конструктора.

Тот же эффект может быть достигнут в C#, объявляя частный (или внутренний) конструктор, но он должен быть объявлен, в противном случае компилятор создает открытый конструктор, и класс действительно является производным.

Любой намек?

2 ответа

Решение

Я думаю, что здесь происходит то, что класс явно объявил внутренний (по умолчанию) конструктор, а не открытый конструктор (ы), поэтому разработчики могут наследовать от класса в пределах определяющей сборки. Все остальные, кроме сборки, не могут наследовать от класса.

WinRT является развитием концепций COM и представляет собой совершенно другую историю, поскольку речь идет о двоичных компонентах, а не о наследовании исходного кода. Самая важная вещь в этой истории ABI - то, что единственные вещи компонента, которые могут использоваться, являются теми, которые выставлены через интерфейсы. Конструкторы не могут быть определены в интерфейсах и статиках, а это значит, что WinRT для них тоже нужны интерфейсы.

C# представления компонентов WinRT являются артефактом языковой проекции, а не реальной компоновкой компонента. Чтобы полностью понять, что там, вы должны взглянуть на компонент в C++, используя собственную библиотеку WRL, которая является библиотекой, используемой для построения WinRT API.

Конструктор - это проекция для фабричного интерфейса компонента WinRT (и для статики, новой для WinRT, поскольку они не существовали в COM, аналогичная обработка).

Когда вы "новый" из C# объекта, сначала создается компонент Factory, связанный с компонентом. После этого фабрика создает объект. По этой причине вопрос конструктора следует рассматривать с точки зрения компонента фабрики, а не с точки зрения конструктора (которые существуют в базовой реализации, но на самом деле это не имеет значения, поскольку то, что вы видите в компоненте, это только его двоичный контракт, ABI),

Итак, есть разные варианты: 1. Фабрика не существует, и вы не можете создать компонент. Если интерфейс Factory внутренний, вы не можете его использовать и не можете создать объект. 2. Фабрика существует и предоставляет конструктор по умолчанию. В C# вы можете создать новый объект 3. Пользовательская фабрика существует и предоставляет пользовательские конструкторы (параметры).

ITransformFactory является частной, и я считаю, что это объясняет поведение, которое вы видели.

На эту тему есть гораздо больше, поскольку агрегация WinRT обеспечивает способ двоичного наследования и управления версиями, но это еще одна (очень длинная) история.

До сих пор копаю, и никогда не остановлюсь, это забавная часть нашей работы:)

Другие вопросы по тегам