後來許多程式設言都有特別為它去支援語法,像是 c#、objectivce c
如果搞不太清楚 Setter/Getter 的用法及用意,可以看一下此篇
學過物件導向的人應該都清楚物件的權限有三種
public、protected、private (friend 丟掉....)
如果想要讓外部的物件 or 函式要使用屬性,必須把屬性宣告成 public 的權限
但實際使用會隱含許多危險的情況,舉個例子(這邊用 c++ 的語法講解)
class CarData {
public:
int energy; // 車子目前能量值
int maxEnergy; // 車子能量值最大上限
};
如果我們想補充車子能量,最快的方法就是
car.energy += 100;
假設 maxEnergy 只有 10、energy 是 5,那計算結果後,energy 就變成了 105
對 CarData 來說,energy 這份資料不合理,可能產生無法預期的錯誤
所以往後的物件設計中,都會採用函式的方式來間接存取變數
public class CarData {
// 將屬性都改為私有
private:
int energy;
int maxEnergy;
int type;
// 間接使用函式來存取上面兩個變數
public:
void SetEnergy(int value);
int GetEnergy();
void SetMaxEnergy(int value);
int GetMaxEnergy();
int GetType();
}
void CarData::SetEnergy(int value) {
energy = value;
// 限制 energy 在 0 ~ maxEnergy 的範圍
if( energy > maxEnergy )
energy = maxEnergy;
else if( energy < 0 )
energy = 0;
}
int CarData::GetEnergy() {
return energy;
}
void CarData::SetMaxEnergy(int value) {
maxEnergy = value;
// 限制 maxEnergy 不會小於 1
if( maxEnergy < 1 )
maxEnergy = 1;
}
int CarData::GetMaxEnergy() {
return maxEnergy;
}
// 只有 Get 就是 readonly 啦,不想讓別人改
int CarData::GetType() {
return type;
}
這樣應該比較清楚了吧
外部只能經由函式設定及存取該物件的屬性
即使是給予了錯誤的資料,在該物中也可以修正,避免不預期的 Crash
這種設定屬性的技巧,就是常聽到的 Setter/Getter 啦
沒有留言:
張貼留言