我想创建一个实用程序类(通常是静态的)并将其与 OOP 的抽象相结合。
我的问题是:使用方法隐藏将抽象与静态结合起来是一个很好的实践吗? 因为 C++ 不允许静态虚拟?
class Sort {
private:
static void sort(int *arr, int size);
};
class SelectSort: public Sort {
public:
static void sort(int *arr, int size);
};
class InsertSort: public Sort {
public:
static void sort(int *arr, int size);
};
所以我们有一个模仿 Java 接口的 Sort 类。
-> 我们说:“所有继承 Sort 类的东西都应该有 sort() 方法”
-> 此外,我们不需要排序类的实例,因此它们是静态的。
现在,我们可以在不创建类实例的情况下调用静态实用方法,并且还使用了抽象。
SelectSort::sort(arr, length);
我尝试过将静态方法设为虚拟
class Sort {
private:
virtual static void sort(int *arr, int size);
};
并出现以下错误:
错误:成员“sort”不能同时声明为“virtual”和“static”
我应该使用方法隐藏还是我不应该打扰而只选择一个概念 - 要么进行排序静态要么使用多态性?
我知道方法隐藏不是真正的多态性,但是在语言语义不允许的情况下我们可以模仿多态性。
我用它是为了让程序员知道,而不是为了让编译器知道。
我的问题更多的是关于正确的设计方法。我的猜测是,所有三种解决方案(静态、多态性、方法隐藏)都是有效的。但哪种方法更可取?
使用 std::function 能够将自定义排序函数传递给另一个函数的示例
#include <span>
#include <vector>
#include <functional>
namespace myAlgorithms
{
void quick_sort_sort(std::span<int> data)
{
}
void bubble_sort(std::span<int> data)
{
}
} //namespace myAlgorithms
void function_using_sort_function(std::span<int> values, std::function<void(std::span<int>) sorter )
{
}
int main()
{
std::vector<int> values{5,7,4,3,1,8};
function_using_sort_function(values,myAlgorithms::bubble_sort);
}