- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
好吧,几乎在我读到的所有地方,我都读到 getter/setter 是“邪恶的”。现在,作为一个经常在 PHP/C# 中使用 getters/setters 的程序员,我看不出它们是如何活着的。我读到它们破坏了封装等,但是,这是一个简单的例子。
class Armor{
int armorValue;
public:
Armor();
Armor(int); //int here represents armor value
int GetArmorValue();
void SetArmorValue(int);
};
现在,假设 getter 和 setter 是“邪恶的”。你应该如何在初始化后更改成员变量。
例子:
Armor arm=Armor(128); //armor with 128 armor value
//for some reason I would like to change this armor value
arm.SetArmorValue(55); //if i do not use getters / setters how is this possible?
无论出于何种原因,我们都可以说以上内容不正确。如果我的游戏将护甲值限制在 1 到 500 之间怎么办?(任何护甲都不能有超过 500 护甲或少于 1 护甲的部件)。
现在我的实现变成了
void Armor::SetArmor(int tArmValue){
if (tArmValue>=1 && tArmValue<=500)
armorValue=tArmValue;
else
armorValue=1;
}
那么,在不使用 getter/setter 的情况下,我还能如何施加此限制?如果不使用 getter/setter,我还能如何修改属性?在情况 1 中 armorValue 应该只是一个公共(public)成员变量,而在情况 2 中使用 getters/setters 吗?
好奇。谢谢大家
最佳答案
你误会了什么。 不使用 getters/setters 会破坏封装并暴露实现细节,对于邪恶的某些定义,可以将其视为“邪恶”。
我想它们在某种意义上可以被认为是邪恶的,因为如果没有适当的 IDE/编辑器支持,用 C++ 编写它们有些乏味......
C++ 的一个缺陷是创建非常量引用 getter,这也允许修改。这相当于返回一个指向内部数据的指针,并且会锁定内部实现的那部分,实际上并不比公开字段好。
编辑:根据评论和其他答案,您听到的可能是指总是为每个 字段创建非私有(private)getter 和setter。但我也不会称之为邪恶,只是愚蠢;-)
关于C++ Getter/Setter(备选方案?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14539838/
注意:使用 jQuery 1.3.2(是的,我正在升级,但为此仍然需要 1.3.2) 寻找更好的方法来实现这一点 HTML 元素(这来自自定义 PHP 框架,更改起来非常麻烦): ... 1
我有一项服务可以提供大多数时间对用户可见的 UI。 当我遇到问题时,我正在尝试新的应用程序架构。 MyModelviewModel viewModel = ViewModelProviders.of(
在 C# 中,我有以下代码: string[] exampleStrings = Console.ReadLine().Split(' '); // C# int[] example
我是一名优秀的程序员,十分优秀!