一个访问器方法返回VARIANT或几个返回不同类型?

时间:2009-06-29 09:12:24

标签: com interop

我有一个COM接口,需要为它添加一个访问器方法。返回的值实际上可以是以下四种类型之一:VARIANT_BOOL,long,BSTR或IDispatch派生接口。

因此我有一个选择:要么我返回VARIANT,要么我有4种不同的访问方法返回不同的类型。

interface IValue1 {
    HRESULT GetType( TypeEnum* );
    HRESULT GetValue( VARIANT* );
};

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或不同类型?

3 个答案:

答案 0 :(得分:2)

我不喜欢因为GetType这件事,而是第一件事。我认为它更灵活。如果将来更改代码可能要求它返回当前集中不可用的类型,则第二个版本将要求您创建新接口,并可能更改客户端代码以处理新接口。

答案 1 :(得分:1)

您的客户端程序员将不得不在两个备选方案中查询GetType方法,然后查询switch语句。因此,我没有看到多种类型特定方法的任何优势。

但是,VARIANT方法显然不会让客户编码器感到困惑。较少的方法意味着较少的认知负荷。所以我认为你应该选择另一个。

答案 2 :(得分:1)

我喜欢第二个。或两者兼而有之,在极少数情况下,消费者真的不在乎他们给予的东西(有点像SqlDataReader.GetValue)。就像Frederick指出的那样,客户端编码器可能最终会编写一个精选案例语句,因此您也可以编写“正确”的数据类型。 真的取决于预期的使用模式,但我倾向于使用适当的数据类型而非变体。