Я часто видел следующее, описанное как «правильный» способ реализации методов get / set:
public class Foo {
private var _someVar:SomeClass;
public function get someVar():SomeClass {
return _someVar;
}
public function set someVar(newValue:SomeClass):void {
_someVar = newValue;
}
}
Теперь, поскольку AS3 всегда возвращает ссылки на классы объектов, когда мы используем "метод "get", мы получаем ссылку на нашу приватную var => инкапсуляцию.
Даже если у нас нет метода set, мы можем изменить privarвар!Какова цель сделать его закрытым?
Единственное решение, которое я нашел, - это вернуть клон "_someVar" в наш метод get, но я никогда не видел этого ни в одном примере.Так что я думаю, что здесь что-то теряю.
Вы возвращаете объект-клон от своих получателей или вы просто принимаете разрыв в инкапсуляции?
РЕДАКТИРОВАТЬ Я понимаю, какустановить и получить методы работает, и я понимаю их преимущества.Я спрашиваю о разрыве «частного» доступа в нашей приватной переменной, когда мы возвращаем его с помощью getter по reference (если наша переменная имеет тип Number, String, int и т. Д. AS3 всегда возвращаетсязначение, а не ссылка, поэтому у нас нет проблем здесь).Возможно, не нарушена инкапсуляция, потому что мы не можем установить свойство без метода установки.Но мы можем изменить его!
См. Этот пример:
public class Foo {
private var _someVar:Array; // note that this is a Object (not Number, String, etc)
public function Foo(){
_someVar = ['don't touch this!'];
}
public function get someVar():SomeClass {
return _someVar;
}
// note that we don't have a setter
}
var f:Foo = new Foo();
var a:Array = f.someVar;
trace(a[0]); // 'don't touch this!'
a[0] = 'why not?';
trace(f.someVar[0]); // 'why not'
Итак, мы изменяем наш приватный var извне и без контроля, даже если у нас нет метода установки.