В 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 обеспечивает способ двоичного наследования и управления версиями, но это еще одна (очень длинная) история.
До сих пор копаю, и никогда не остановлюсь, это забавная часть нашей работы:)