2012-05-08 6 views
7

Der VS-Compiler erlaubt es nicht, versiegelte exposed-Typen für die WINMD-Typbibliothek zu erstellen.Warum exponierte Typen für WinMD/WinRT-Komponenten versiegelt werden müssen?

Warum wird diese Einschränkung gesetzt? (Ich weiß über versiegelte Typen Vorteile, meine Frage ist in Bezug auf Win RT-Komponenten).

+4

Ihr Titel scheint mit der Frage nicht einverstanden zu sein? ("muss versiegelt sein" vs. "erlaubt nicht versiegelt") –

Antwort

4

Dies ist eine architektonische Einschränkung, die von COM auferlegt wird. Was im Kern jedes WinRT-Typs liegt, wird von IUnknown und IInspectable abgeleitet. Das Problem mit COM ist, dass es nur die Schnittstellenvererbung, aber nicht die Implementierungsvererbung unterstützt. Was ein starkes COM-Designziel war, ist die Implementationsvererbung zu komplex mit Implementierungsdetails, einschließlich des berüchtigten Diamantproblems.

Es gibt eine Möglichkeit, Vererbung durch Delegierung zu arbeiten, jede Methode in der abgeleiteten Klasse ruft explizit die entsprechende Basis-Interface-Methode auf, aber das ist sehr schmerzhaft. Aber ansonsten die Art, wie Windows.UI.Xaml-Klassen die Vererbung implementieren.

+0

Das beantwortet die Frage. Besonderer Dank für die Erwähnung des Diamantproblems – Tilak

+1

Das ist nicht ganz genau, es ist möglich, unversiegelte Winrt-Klassen zu implementieren, aber sie können nicht von JavaScript konsumiert werden und sie erfordern die Low-Level- (IDL-) Authoring-Erfahrung, die von Visual Studio ziemlich schwierig sein kann. Darüber hinaus MÜSSEN alle abgeleiteten Klassen (versiegelt oder nicht versiegelt) letztendlich von Klassen im Windows-Namespace abgeleitet werden. –

+0

Können Sie auf eine unterstützende Dokumentation verweisen? Ich würde gerne sehen, wie das gemacht werden kann. In meinem Fall brauche ich alles in VS, aber es wäre wert zu wissen, wie die Dinge im Hintergrund laufen – Tilak

1

Ich glaube der Grund ist, weil exponierte Typen aus allen verschiedenen Arten von Sprachen (C#, C++, JavaScript und vielleicht mehr in der Zukunft) verwendbar sein sollten.

Wenn Sie also eine Klasse haben, dann überschreibt die Verwendung einer Klasse diese in eine neue Klasse. Ich könnte den Unterricht überbewerten wollen, der in anderer Sprache gemacht wird. Aber das ist ein Problem. Wie möchten Sie eine Basisklasse in C# überschreiben, indem Sie in C++ eine Erbenklasse erstellen? Dies kann niemals funktionieren, da beide vollständig verschiedene und inkompatible OOP-Implementierungen haben.

Indem Sie exponierte Klassen zum Versiegeln zwingen, entfernen Sie dieses Problem und stellen sicher, dass die Leute nicht versuchen, etwas wie das zu tun.

Ich bin mir sicher, es gibt viel grundlegendere Dinge als das, aber das kam mir zuerst in den Sinn.

Verwandte Themen