静态与非静态方法2

时间:2009-07-27 06:19:52

标签: static non-static

  

可能重复:
  Static vs. non-static method

哪一个更适合好的设计

或者有什么区别?还是仅仅取决于开发人员?

class Foo
{
    int x;

    void add(Foo* f1) //Method 1
    {
        x += f1->x;
    }

    static void add(Foo* f1, Foo* 2) //Method 2
    {
        f1->x = f1->x + f2->x;
    }

    static Foo* add(Foo* f1, Foo* 2) //Method 3
    {
        Foo* foo = new Foo();
        foo->x = f1->x + f2->x;
        return foo;
    }
}

4 个答案:

答案 0 :(得分:3)

从OO的角度来看,我认为更好的方法是:

class Foo
{
    int x;

    void add(Foo* f1) //Method 1
    {
        x += f1->x;
    }
}

方法应该链接到不属于类的对象。

C ++是面向对象的,而不是面向类的。

在我看来,使用太多静态方法会破坏对象的好处(polymorphsim,inheritance ......)

答案 1 :(得分:3)

第一和第三选择都很好 - 选择哪一个取决于你的意图。我不会使用第二种选择 - 它没有透露它的意图。

当您使用第一种方法时,您明确指出,该添加将修改对象。当程序员看到:

Foo f1, f2;
f1.add(&f2);

他/她已经知道,这次调用可以/将修改f1。

当你使用第三种方法时,你声明没有任何传递的对象会被修改,所以当程序员看到时:

Foo f1, f2;
Foo *result;
result = Foo.add(&f1, &f2);

他/她知道,f1和f2不会被修改(你应该使用语言为你强制执行的选项)。

正如我所写 - 第一种和第三种方法之间的选择取决于你的意图。如果你想将Foo视为值对象 - 这意味着你可以相信,一旦你设置了它的字段,无论你在哪里传递你的对象,它们都将保持这种方式,使用第三种方法。如果你想将Foo视为状态可以改变的对象,并且你同意将Foo对象传递给方法可以改变它的状态 - 使用第一个选项。

但是,当你使用第二个选项时 - 程序员不知道你是修改了第一个,第二个,两个还是两个参数。不要使用此选项。

答案 2 :(得分:3)

程序员的方法的静态或非静态差异主要是您希望实现的设计和行为的问题。对此没有绝对的真理或总是正确的答案。

直截了当的区别是静态方法是无状态的,而非静态方法是有状态的。如果这是实例化的问题,那么有很多设计都支持静态方法,例如。

但只有通过彻底检查设计中各类职责,才能获得正确的设计答案。

答案 3 :(得分:1)

如果你可以只使用类的公共特性来实现函数/方法,那么你应该使它成为一个非成员函数/方法(在某些语言的单独类中的静态方法,或者在C#或VB.NET)。

与实例方法混合到同一个类中的静态方法往往非常模糊和混乱。它们只能看到静态数据,所以就像将单例的定义混合到其他东西的定义中一样。将它们分开是更清楚的。