У меня есть COM-интерфейс, и мне нужно добавить к нему метод доступа. На самом деле возвращаемое значение может быть одного из 4 типов: VARIANT_BOOL, long, BSTR или интерфейс, производный от IDispatch.
Поэтому у меня есть выбор: либо я возвращаю VARIANT, либо у меня есть 4 разных метода доступа, которые возвращают разные типы.
interface IValue1 {
HRESULT GetType( TypeEnum* );
HRESULT GetValue( VARIANT* );
};
or
interface IValue2 {
HRESULT GetType( TypeEnum* );
HRESULT GetLongValue( long* );
HRESULT GetBstrValue( BSTR* );
HRESULT GetBoolValue( VARIANT_BOOL* );
HRESULT GetInterfaceValue( ICustomInterface** );
}
У меня все равно будет IValueX::GetType — для ясности. Если я выберу последний вариант, только один из 4 методов доступа фактически вернет значение, все остальные укажут на ошибку из-за несоответствия типов.
Мне нужно, чтобы этот интерфейс был доступен как можно большему количеству клиентов, включая VB6, Perl, .NET.
Какая альтернатива лучше - с VARIANT или с отдельными типами?