2012-05-08 6 views
7

Компилятор VS не позволяет создавать закрытые открытые типы для библиотеки типа WINMD.Почему открытые типы должны быть запечатаны для компонентов WinMD/WinRT?

Почему это ограничение помещено? (Я знаю о преимуществах закрытых типов, мой вопрос касается компонентов Win RT).

+4

Ваше название, похоже, не согласуется с вопросом? («должно быть опечатано») или «не допускается запечатывание») –

ответ

4

Это архитектурное ограничение, налагаемое COM. Что находится в ядре любого типа WinRT, они получены из IUnknown и IInspectable. Проблема с COM заключается в том, что он поддерживает только наследование интерфейса, но не наследование реализации. Которая была сильной целью COM-дизайна, наследование реализации слишком чревато деталями реализации, включая проблему печально известного алмаза.

Существует способ сделать работу наследования делегированием, каждый метод в производном классе явно вызывает соответствующий метод базового интерфейса, но это очень больно для себя. Но иначе способ, которым классы Windows.UI.Xaml реализуют наследование.

+0

Это отвечает на вопрос. Особая благодарность за упоминание проблемы с алмазами – Tilak

+1

Это не совсем точная версия, можно реализовать незапечатанные классы winrt, но они не могут быть использованы из JavaScript, и им требуется использование авторского опыта низкого уровня (IDL), что может быть довольно сложным из визуальной студии. Кроме того, все производные классы (закрытые или незапечатанные) ДОЛЖНЫ в конечном итоге вытекать из классов в пространстве имен Windows. –

+0

Можете ли вы указать на любую поддерживающую документацию. Я хотел бы посмотреть, как это можно сделать. В моем случае мне нужно все это в VS, но было бы полезно знать, как обстоят дела в фоновом режиме – Tilak

1

Я считаю, причина в том, что открытые типы должны использоваться из разных языков (C#, C++, JavaScript, возможно, больше в будущем).

Итак, если у вас есть класс, то одно из классов использования класса переопределяет его в новый класс. Я мог бы переопределить класс, который выполняется на другом языке. Но это проблема. Как вы хотите переопределить базовый класс, сделанный в C#, классом наследователя, выполненным на C++? Это никогда не может работать, потому что оба они имеют совершенно разные и несовместимые реализации ООП.

Заставляя открытые классы запечататься, вы устраняете эту проблему и следите за тем, чтобы люди не пытались сделать что-то подобное.

Я уверен, что есть гораздо более фундаментальные вещи, чем это, но это то, что мне пришло в голову.