2012-05-08 17 views
7

Il compilatore VS non consente di creare tipi esposti sigillati per la libreria dei tipi WINMD.Perché i tipi esposti devono essere sigillati per i componenti WinMD/WinRT?

Perché viene applicata questa restrizione? (Conosco i vantaggi dei tipi sigillati, la mia domanda riguarda i componenti di Win RT).

+4

Il tuo titolo sembra essere in disaccordo con la domanda? ("deve essere sigillato" rispetto a "non consente la chiusura") –

risposta

4

Questa è una limitazione architettonica imposta dalla COM. Che si trova al centro di qualsiasi tipo di WinRT, sono derivati ​​da IUnknown e IInspectable. Il problema con COM è che supporta solo l'ereditarietà delle interfacce ma non l'ereditarietà dell'implementazione. Quale era un forte obiettivo di progettazione COM, l'ereditarietà dell'implementazione è troppo carica di dettagli di implementazione, incluso il malfamato problema dei diamanti.

C'è un modo per rendere l'ereditarietà del lavoro per delega, ogni metodo nella classe derivata chiama esplicitamente il corrispondente metodo dell'interfaccia di base, ma è molto doloroso farlo da solo. Ma altrimenti il ​​modo in cui le classi Windows.UI.Xaml implementano l'ereditarietà.

+0

Questo risponde alla domanda. Un ringraziamento speciale per aver menzionato il problema dei diamanti – Tilak

+1

Non è abbastanza preciso, è possibile implementare classi winrt non sigillate, ma non possono essere consumate da JavaScript e richiedono l'esperienza di authoring di basso livello (IDL), che può essere piuttosto impegnativa da Visual Studio. Inoltre, tutte le classi derivate (sigillate o non sigillate) DEVONO in definitiva derivare da classi nello spazio dei nomi di Windows. –

+0

Puoi indicare qualsiasi documento giustificativo. Mi piacerebbe vedere, come può essere fatto. Nel mio caso, ho bisogno di tutto in VS, ma varrebbe la pena di sapere come stanno andando le cose in background – Tilak

1

Credo che la ragione sia perché i tipi esposti dovrebbero essere utilizzabili da tutti i diversi tipi di linguaggi (C#, C++, JavaScript forse più in futuro).

Quindi, se si dispone di una classe, l'uso di una classe viene sovrascritto in una nuova classe. Potrei voler dare lezioni di classe, che è fatto in una lingua diversa. Ma questo è un problema. Come si vuole sovrascrivere una classe base fatta in C#, per classe ereditaria fatta in C++? Questo non può mai funzionare, perché entrambi hanno implementazioni OOP completamente diverse e incompatibili.

Forzando le classi esposte a essere sigillate, rimuovi questo problema e assicurati che le persone non proveranno a fare qualcosa di simile.

Sono sicuro che ci sono molte più cose fondamentali di questo, ma questo è quello che mi è venuto in mente prima.