对我来说,继承的优点之一是公共方法在基类中编写一次,并且每个继承类也自动具有该方法。
例如,现在让我说我想为软件中的每个类提供一个“交换”方法。提供此功能的类如下:
template< typename... DataMembers >
class SwapMethodProvider
{
public:
inline void Swap( SwapMethodProvider& other );
private:
std::tuple< DataMembers... > member_dataMembers;
};
template< typename... DataMembers >
inline void SwapMethodProvider< DataMembers... >::Swap( SwapMethodProvider& other )
{
// Swap between the tuples that contain the data members
std::swap( member_dataMembers, other.member_dataMembers );
}
现在,如果只有一个类从中继承,那么一切都会很好。但是,如果我希望我的软件中的每个类都可以从中继承,那么以下操作将不起作用,因为直接的基类由于模糊性而无法访问:
class ExtraSauce : public SwapMethodProvider< int, double >
{};
class EvenMoreExtraSauce : public ExtraSauce, public SwapMethodProvider< int, double >
{};
然后,第一类“ ExtraSauce”可以正常工作,但“ EvenMoreExtraSauce”将无法编译。现在,我明白了为什么它不能编译,但是剩下要做的就是将类的“ SwapMethodProvider”实例存储为数据成员。我的问题只是重复代码,因为每个类都需要具有自己的“ Swap”方法,该方法调用“ SwapMethodProvider”实例的“ Swap”方法。
首先,我到目前为止是否正确?我想肯定地知道这种行为是不可能的。
第二,为什么继承在一个级别下得到如此严重的支持?编写一次方法,然后让所有对象都继承该方法真是太酷了。即使同一对象出现多次,也可能以各种方式在一个类中出现一次。
答案 0 :(得分:1)
CRTP。
DECLARE @SQL nvarchar(MAX);
SET @SQL = N'CREATE USER ' + QUOTENAME(@Login) + N' FOR LOGIN '+ QUOTENAME(@Login) + N';';
EXEC sp_executesql @SQL;