面向对象问题

3

我最近提交了一份课程作业,但是我的老师说我的方法有问题,所以我被扣掉了分数。如果有人能告诉我我做错了什么以及如何解决这个问题,我将不胜感激。(忽略语法,但思路在那里,这是在Objective C中,但我猜相同的原则也适用)

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;
           }
}

在反馈中,老师说我的面向对象方法是错误的。因为我在计算类中没有任何变量,我本可以把所有东西都放在主类中并从那里调用。
这是真的吗?怎么解决?(我只需把变量放入计算类中吗?- 我发现只需通过参数传递变量更容易)。
谢谢任何帮助。

1
你正在使用对象作为命名空间。然而,Java一直采用这种方法,所以我不认为你应该因此失分。 - deceleratedcaviar
1
我猜老师的意思是,与其使用一个单独的类"CalculateClass",你完全可以在主类上创建一个方法来实现同样的功能? - Pepto
4
老师错过了一个教学时机。仅仅因为按照教条来扣分并没有解释为什么这样做是错误的,以及为什么答案可能不正确,所以学生们无法从中学到东西。 - duffymo
是的,有学习。现在是个人自己在学习。加油!(在教学时刻上部分达成共识;老师必须选择合适的教学时机开始教学 :)) - sehe
Objective-C 不提供基本函数吗?我不明白为什么我们需要在这里使用一个类。 - Alexandre C.
@user648244:看来你忘记提到最重要的事情了:你是用这段代码解决什么问题的?(如果任务是将两个int变量相加,那么你的老师是正确的:只需在main()函数中输入'a+b',而不需要其他类和垃圾)。这是要示范面向对象编程还是其他什么东西? - Serge Dundich
5个回答

3
问题在于你所接收的任务是一个功能性的任务。
自然而然地,你的解决方案会倾向于功能性解决方案,而远离所要求的人工面向对象的解决方案。
你可以将解决方案放入像你的老师所要求的“真正”的面向对象的框架中(将变量放入类中),但在我看来这不是很自然。

我认为问题中存在一些模糊之处,即老师是否希望采用面向对象的方法来解决。 - paulbailey

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);
    }
}

1

你的老师可能不完全正确,

在面向对象编程中,我们有一种叫做“静态类”的东西,它不包含实例级别的属性(动态属性),就像你上面实现的代码一样,

这个静态类包含了其他类使用的共享方法。

例如,在伪代码中:


//翻译短语的类
class translator {
static string translate(string phrase,string destination_language) { //将“phrase”翻译成“destination_language”并返回 } }

2
在C++中(也许在Objective C中也是如此,我不确定),这里使用了一个普通的函数。在那些愚蠢地禁止自由函数的语言中(比如Java、C#),你必须采用“我的类实际上是一个命名空间”的习惯用法(你称之为“静态类”)。通常我认为这是一种代码异味,但有时候无法避免。 - Alexandre C.
1
我和 @Alexandre 的想法一致。一些语言设计者认为禁止自由函数才是使他们的语言“面向对象”的原因。但实际上并不是这样! - Bo Persson

0

你的教练可能希望你能够编写

object3.calculate(object1, object2);

仅仅把一个函数放在类里面并调用它,并不意味着就是面向对象的编程。

class Calculations
{
     int calculate(int a, int b);
}

并不比任何其他编程语言更“面向对象”

namespace Calculations
{
    int calculate(int a, int b);
}

1
有些人显然持不同意见。 :-) 你想发表评论吗? - Bo Persson
我不是那个点踩的人,但我能理解为什么你的回答会被点踩,因为它并没有清楚地说明原帖作者应该如何应对老师的批评。 - Rinzwind
@Rinzwind - 没错,我不想替他完成作业。:-) 我指出了原始尝试中存在的问题和一些解决方案,希望他/她能从中得出一些结论。也许能学到点什么呢? - Bo Persson
啊,现在我明白了。 :) 我建议你在有意发布不完整或可能不正确的答案时添加解释性免责声明。我最近也做了类似的事情:http://stackoverflow.com/questions/5494133/nsstring-writetofile-with-url-encoded-string/5507008#5507008。对于你的情况,可以写上这样一句话:“我不想提供完整的答案,因为这是一门课程作业,但是我给出一个提示,希望你能自己找到答案并学习。” 这有助于防止“这家伙怎么会发布那样的答案?!”- 的投票;) - Rinzwind

0

以下是可能更符合你老师期望的内容(采用伪面向对象语言编写):

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可以从不同的方式构建,但总是以相同的方式调用(例如,在运行时可以用计算不同方式的另一个对象替换它)。 这就是“函数对象”惯用语。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接