Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Com 一个访问器方法返回一个变量还是返回几个不同的类型?_Com_Interop - Fatal编程技术网

Com 一个访问器方法返回一个变量还是返回几个不同的类型?

Com 一个访问器方法返回一个变量还是返回几个不同的类型?,com,interop,Com,Interop,我有一个COM接口,需要添加一个访问器方法。返回的值实际上可以是4种类型之一:VARIANT_BOOL、long、BSTR或IDispatch派生接口 因此,我有一个选择:要么返回一个变量,要么使用4种不同的访问方法返回不同的类型 interface IValue1 { HRESULT GetType( TypeEnum* ); HRESULT GetValue( VARIANT* ); }; 或 为了清楚起见,我还是要使用IValueX::GetType。如果我选择后一个选项

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

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

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

为了清楚起见,我还是要使用IValueX::GetType。如果我选择后一个选项,则4个访问器中只有一个会实际返回值,其他所有访问器都会由于类型不匹配而指示错误

我需要这个接口可以从尽可能广泛的客户机上使用-包括VB6、Perl、.NET


哪种选择更好?使用VARIANT还是使用distinct类型?

我不太喜欢这两种选择,因为
GetType
这件事,但还是使用第一种。我认为它更灵活。如果将来对代码进行更改,可能需要它返回当前集合中不可用的类型,则第二个版本将要求您创建一个新接口,以及可能对客户端代码进行的更改,以处理新接口。

由于
GetType
的原因,我不太喜欢这两个版本,但还是使用第一个版本。我认为它更灵活。如果将来对代码进行更改,可能需要它返回当前集合中不可用的类型,则第二个版本将要求您创建一个新接口,以及可能对客户端代码进行的更改,以处理新接口。

您的客户端程序员必须在两个备选方案中查询GetType方法,然后是switch语句。因此,我并不认为多个特定于类型的方法有任何优势


然而,对于客户机编码人员来说,变体方法显然不那么容易混淆。更少的方法意味着更少的认知负荷。因此,我认为您应该选择它,而不是另一个。

您的客户机程序员必须在两个备选方案中查询GetType方法,然后是switch语句。因此,我并不认为多个特定于类型的方法有任何优势


然而,对于客户机编码人员来说,变体方法显然不那么容易混淆。更少的方法意味着更少的认知负荷。所以我觉得你应该把它挑出来。

我喜欢第二个。或者两者兼而有之,很少有时候消费者真的不在乎他们得到了什么(有点像
SqlDataReader.GetValue
)。正如Frederick指出的,客户机编码人员可能最终会编写一个select case语句,因此您也可以编写“适当”的数据类型。它实际上取决于预期的使用模式,但我倾向于使用正确的数据类型而不是变体。

我喜欢第二种。或者两者兼而有之,很少有时候消费者真的不在乎他们得到了什么(有点像
SqlDataReader.GetValue
)。正如Frederick指出的,客户机编码人员可能最终会编写一个select case语句,因此您也可以编写“适当”的数据类型。它实际上取决于预期的使用模式,但我倾向于使用正确的数据类型而不是变体

interface IValue2 {
    HRESULT GetType( TypeEnum* );
    HRESULT GetLongValue( long* );
    HRESULT GetBstrValue( BSTR* );
    HRESULT GetBoolValue( VARIANT_BOOL* );
    HRESULT GetInterfaceValue( ICustomInterface** );
}