2009-06-29 40 views
1

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

因此,我有一个选择:要么我返回一个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还是使用不同的类型?

回答

1

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

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

2

我真的不喜欢,因为GetType的事情,但与第一。我认为它更灵活。如果将来可能需要更改代码才能返回当前集合中不可用的代码,则第二个版本将要求您创建一个新的接口,并可能更改客户机代码以处理新的接口。

1

我喜欢第二个。或者两者兼而有之,在消费者真的不在乎他们给予什么的罕见时候(有点像SqlDataReader.GetValue)。就像Frederick指出的那样,客户端编码器最终可能会编写一个select case语句,因此您最好编写“正确的”数据类型。它真的取决于预期的使用模式将是什么,但我会倾向于正确的数据类型超过变种。