Статические интерфейсы IDL

Для WinRT IDL теперь поддерживает такие конструкции:

[marshaling_behavior(agile)]
[threading(both)]
[activatable(0x06020000)]
[version(0x06020000)]
[static(Windows.Networking.Sockets.IDatagramSocketStatics, 0x06020000)]
runtimeclass DatagramSocket
{
    [default] interface Windows.Networking.Sockets.IDatagramSocket;
    interface Windows.Foundation.IClosable;
}

Меня интересует атрибут static. Что это значит? Как это связано с интерфейсами, перечисленными внутри тела runtimeclass?


person Martin v. Löwis    schedule 15.10.2012    source источник


Ответы (2)


COM не поддерживает понятие статических методов класса, все методы должны быть методами экземпляра, поскольку методы интерфейса являются абстрактными. Атрибут позволяет языковой проекции эмулировать статическое поведение метода. В частности, DatagramSocket.GetEndpointPairsAsync() перегружается.

Примечательно также, что COM также не поддерживает перегрузки, что также решается с помощью атрибута. Методы IDatagramSockeStatics имеют атрибут [overload], настоящее имя второй перегрузки — GetEndpointPairsWithSortOptionsAsync().

person Hans Passant    schedule 15.10.2012

Статические методы интерфейса winrt реализуются как интерфейсы вне фабрики классов для этого класса.

В этом случае вы должны вызвать (многие накладные расходы winrt опущены):

ComPtr<IDatagramSocketStatics> factory;
HRESULT hr = RoGetActivationFactory(<HSTRING for Windows.Networking.Sockets.DatagramSocket>, __iidof(IDatagramSocketStatics), &factory.GetAddressOf());
hr = factory->DatagramFactoryMethod(<Parameters>);

Как я уже упоминал, это псевдокод, но его должно быть достаточно, чтобы понять, как вызывать статические методы.

person ReinstateMonica Larry Osterman    schedule 16.10.2012
comment
Ваш комментарий также полезен, поскольку в нем рассказывается, как вызывать статику; Ответ Ханса буквально ответил на мой вопрос о том, что означают статические атрибуты, поэтому я принял его ответ. - person Martin v. Löwis; 16.10.2012
comment
Причина, по которой я дал отдельный ответ, заключалась в том, чтобы выразить бинарное поведение, связанное с атрибутом Windows.Foundation.Metadata.StaticAttribute — бинарное поведение совсем не ясно из атрибута. - person ReinstateMonica Larry Osterman; 17.10.2012