2 C和x2B+;具有相同功能但变量名不同的类-使用哪种模式? 我有2个C++类,它们具有相同的变量类型,需要对这些变量执行完全相同的操作。但是,这两个类的变量名和函数名不同,因为它们在各自的类中表示不同的内容
如何在没有代码重复的情况下实现这一点?继承或模板在这里有用吗 这里有一个简单的例子2 C和x2B+;具有相同功能但变量名不同的类-使用哪种模式? 我有2个C++类,它们具有相同的变量类型,需要对这些变量执行完全相同的操作。但是,这两个类的变量名和函数名不同,因为它们在各自的类中表示不同的内容,c++,oop,templates,inheritance,design-patterns,C++,Oop,Templates,Inheritance,Design Patterns,如何在没有代码重复的情况下实现这一点?继承或模板在这里有用吗 这里有一个简单的例子 class A { private: float m; float n; public: float foo() {return m + n}; }; class B { private: float p; float q; public: float bar() {return p + q}
class A
{
private:
float m;
float n;
public:
float foo() {return m + n};
};
class B
{
private:
float p;
float q;
public:
float bar() {return p + q};
};
在我的例子中,操作和变量比上面的例子更复杂。这两个类之间唯一的区别是变量名和函数名。其余的都一样。如何在C++中重构这个?< p>有几种方法来处理这个问题。
- 优点:最大限度地减少代码重复
- 缺点:如果这是针对两个不同的应用程序,则违反了单一责任原则
- 优点:最大限度地减少代码重复
- 缺点:可能不是偶然的
typedef
创建另一个名称。
- 优点:最大限度地减少代码重复
- 缺点:只更改“类”的名称,而不更改方法调用
- 优点:每个类负责自己的非相关操作,并独立于其他类进行操作
- 缺点:可能的代码重复
如果它们是相关的,那么考虑它是否会遵循继承的关系。如果没有,请再次将它们保留为两个类。两个相当复杂的函数,除了使用哪些变量外,它们是相同的?听起来像是一个简单的例子,在这个例子中,公共性可以被提取到一个单独的函数中,该函数为不同的事物提供参数。例如:
float DoComplicatedThing(float a, float b)
{
// whatever the complicated thing is
// ...
// but staying with your example it's just:
return a + b;
}
class A
{
private:
float m;
float n;
public:
float foo() { return DoComplicatedThing(m, n) };
};
class B
{
private:
float p;
float q;
public:
float bar() { return DoComplicatedThing(p, q) };
};
如果有充分的理由让
a
和B
派生自公共基类,那么docompleedthing
可能是该基类的静态函数。否则,它可能只是一个没有类的独立函数(如我的示例中所示)。好吧,首先你应该知道为什么它们是分开的。为什么不在两种情况下都使用一个类呢?(我认为大多数其他解决方案可能会增加不必要的复杂性)我如何在没有代码重复的情况下实现这一点代码复制没有问题。如果类型的含义不同,那么类具有相同的布局只是巧合。如果我有20个成员的班级被称为Car
,而另一个碰巧也有同样的20个成员,但它是Toaster
?。顺便说一句,如果你看一个真实世界的程序,这个程序可能有许多“两个成员”类,所有这些类的含义都不同。如果我们知道这些类是什么,那将是很有帮助的。使用std::pair
作为泛化(respclass Base{std::pair y;public:T baz(){return y.first+y.second;};
)?为了回应@PaulMcKenzie,如果两种不同的类型用于表示不同的事物,并且在不同的情况下使用,那么具有相同布局的两种不同类型没有问题。如果你真的只想有一个类型(比如说它叫MySingleType
),你可以做typedef MySingleType NameOne代码>和typedef MySingleType name二
若要创建别名,则可以使用NameOne
和NameTwo
将其视为自己的类型。