这个问题与一般的OOP练习有关。 假设我们有一个接受来自对象外部参数的公共函数的类。这不是违反封装本身吗?另一方面,为什么这种做法被广泛使用?在调用函数时,类和成员变量的所有构造函数都是“绕过”的。作为OOP的一个相对较新的程序员和我对封装的理解,我的函数参数通过setter传递给对象,这样我就可以使用传入的成员变量保留所有函数,而不使用任何参数。 我知道某些参数可以通过构造函数传递(顺便说一句,我使用依赖注入),但是如果在实例化对象后这些参数发生了变化呢?创建对象后,必须有方法来更改这些值。到目前为止,我没有发现使用setter来完成这个任务的其他选择,但是程序员之间长期以来讨论的是getter和setter是“邪恶的”,或者至少被认为没有好的编程习惯。 任何人都可以告诉我在哪里我错过了这一点,以及如何以一种干净的方式解决这个困境? 非常感谢您的支持。函数参数是否违反封装?
下面是一个使用C#的具体很简单的例子:
我们有一个Windows窗体项目持有3个文本框,一个名为textBox1的1和TextBox和textBox3一种形式。
任务是添加textBox1的1和TextBox的值,并使用由事件处理程序任何时候实例化textBox1的或TextBox2中的值更改类AddTextboxValues结果反馈给textBox3:
我经常看到它,并询问是否方式是封装的冲突:
public class AddTextBoxValues
{
public double TextBoxValueSum(double textBox1value, double textBox2Value)
{
return textBox1value + textBox2Value;
}
}
这是我使用的时刻按我封装的理解方式:
public class AddTextBoxValues
{
private double textBox1Value;
private double textBoxValue2;
private double textBoxValue3;
public double TextBox1Value
{
set { textBox1Value = value; }
}
public double TextBoxValue2
{
set { textBoxValue2 = value; }
}
public double TextBoxValue3
{
get { return textBoxValue3; }
}
public void TextBoxValueSum()
{
textBoxValue3= textBox1Value + textBoxValue2;
}
}
这也有其优点,它可以注入到窗体构造函数中。
任何意见是非常感谢。
这将是有益的,如果你给一个具体的例子 - 这听起来像你将对象的状态与其他需要*处理的状态混淆*。 (例如,日期格式化程序需要知道它意图使用的格式,但它会通过“日期格式化”,而且这不是对象本身状态的一部分。) –
那么,这些是两种不同的方式达到相同的结果 - 但是,您是否真的希望将文本框的值作为类的一部分?你认为在所有的情况下,他们应该是? –
你使用的是什么定义的“封装”会暗示它是通过使用方法参数“绕过”的? –