我最近做了一个课程作业,我的老师说我的方法是错的,我的标记被取消了。如果有人能告诉我我做错了什么以及如何解决这个问题,我将不胜感激。(忽略语法,但想法就在那里,这是客观的,但我想同样的原则也适用)
main class()
{
int variable1;
int variable2;
int variable3;
CalculationClass object1;
variable3 = object1.calculate(variable1,variable2);
}
CalculationClass()
{
int calculate(int a, int b)
{
int c;
c = a+b;
return c;
}
}
在反馈中,老师说我的面向对象的方法是错误的。因为我在计算类中没有任何变量,所以我可以将所有内容放在主类中并从那里调用它。
这是真的吗?怎么解决这个问题? (我只是把变量放在计算类中吗?? - 我发现通过参数传递变量更容易。)
感谢您的帮助
答案 0 :(得分:3)
问题在于赋予你的作业具有功能性。
当然,您的解决方案转向功能性解决方案,远离顶部所需的人工面向对象。
您可以将解决方案放在像教师要求的“真正的”面向对象服装中(将变量放入课堂)但在我看来并不自然。
答案 1 :(得分:1)
你的老师可能不完全正确,
在OOP中我们有一个名为'静态类'的东西,它不包含 实例级属性(动态属性), 与实现上述代码的方式相同,
此静态类包含其他类使用的共享方法
例如伪代码:
//class for translating phrases class translator { static string translate(string phrase,string destination_language) { //return the 'phrase' in 'destination_language' } }
答案 2 :(得分:1)
我同意Peter G.这是一个功能性问题,我相信。然而,另一种解决方案是创建一个类Number,一个包含计算和其他转换方法的int包装器,以及您可能需要的功能。
示例:
Number num1 = Number(variable1);
Number num2 = Number(variable2);
Number num3;
num3 = num1.plus(num2); //Personally I believe this looks more OOP ;)
这将以某种方式实现:
class Number(){
int var;
Number(int v){var = v;}//constructor
Number plus(Number otherNum){//calculation
return Number(this.var + otherNum.var);
}
}
答案 3 :(得分:0)
您的教练可能希望您能够写
object3.calculate(object1, object2);
不只是将一个函数放在一个类中并调用该面向对象。
class Calculations
{
int calculate(int a, int b);
}
不再是“面向对象”而不是
namespace Calculations
{
int calculate(int a, int b);
}
答案 4 :(得分:0)
这可能更像是老师想要的(用伪OOP语言):
class Computation
{
private int a, b;
public Computation(int a_, int b_)
{
a = a_; b = b_;
}
public int compute()
{
return a + b;
}
};
int main()
{
int v1, v2;
...
Computation c(v1, v2);
v3 = c.compute();
}
这里的要点是类Computation
可以用各种不同的方式构造,但总是以相同的方式调用(例如,在运行时由另一个计算不同方式的对象替换)。这是“函子”的习语。