0

对不起,如果这个问题听起来令人困惑。我的意思是,如果我有一个类,它有一个方法可以进行大量计算然后返回一个值,我可以将该方法设为公共(这使我的其他类可以访问),或者我可以将其设为私有并使其公共获取方法。

像这样的东西:

public publicmethod{
    return privatemethod();
}
private privatemethod{
    //do stuff
    return value;
}

这是徒劳的练习还是提供了额外的程序安全性?

4

5 回答 5

4

好吧,这里没有额外的安全措施。但是,这种用法有时是有意义的。

例如,私有方法和公共方法可能具有不同的语义。

// base class
public virtual BuyFood()
{
    BuyPizza();
    BuyCoke();
}
private void BuyPizza()
{
    // ...
}

// derived class
public override void BuyFood()
{
    BuyChopSuey();
}
private void BuyChopSuey()
{
    // ...
}

所以你的实现只是调用一个私有方法——但重要的是,你暴露了语义:你的BuyFood操作只是BuyChopSuey(). 您的代码以明确的方式说:“在这堂课中,购买食物只是购买杂碎”。您可以随时添加,BuyTsingtaoBeer()BuyFood()无需更改这两种方法的语义。

于 2012-08-31T17:36:44.317 回答
3

这是完全多余的。除了同一事物的另一个名称和读者遵循的另一个间接方式之外,它没有提供任何东西。只需制作一个实现,并将其公开。同样,getX() { return x; } setX(T newX) { x = newX; }不封装任何东西,充其量是面向未来的。

您最终可能会在一行中实现接口所需的特定功能,主要委托给(可能是私有的)方法,这些方法出于其他充分的理由而存在。这是不同的,而且更合理(但同样,如果只是 return someMethod();你应该废除私有实现并采用通用名称)。一个特殊情况,如果您需要两个实现两个做同样事情的方法(例如,来自不同的接口)。

于 2012-08-31T17:32:34.123 回答
1

我认为任何一种方式都很好,假设该方法不会改变类的状态,这更多的是风格问题。如果你的类有很多属性和很少的方法,那么定义另一个属性可能更有意义。如果你的类中有很多方法但属性很少,那么一个方法更符合你的整体类设计。

如果该方法更改了一堆其他类变量,那么我会将其公开为公共方法而不是属性。

我不认为任何一种方式,财产或方法,一定更安全。这取决于您所做的检查 - 是否允许调用者执行计算?计算中使用的所有变量是否都在可接受的范围内?等等。无论您使用的是属性还是方法,都可以执行所有这些检查。

于 2012-08-31T17:32:07.923 回答
0

嗯,其实问题是What code do I want to be able to call this method?

  • 一般的任何代码,甚至来自其他程序集?制作方法public
  • 来自同一个程序集的任何代码?让它internal
  • 只有这个类的代码?让它private

将私有方法直接别名为公共方法只会使私有方法可以从外部调用,这与其private状态相矛盾。

于 2012-08-31T17:35:05.150 回答
0

如果该方法只进行一些计算并且不使用或更改对象中的任何内容,请将其设为公共静态方法:

public static CalculationMethod(int input) {
  //do stuff
  return value;
}

这样任何代码都可以使用该方法而无需创建类的实例:

int result = ClassName.CalculationMethod(42);

而不是public考虑internal,这将只允许访问同一程序集中的代码。

于 2012-08-31T17:36:33.213 回答