Это сложный вопрос, который, как я знаю, является проблемой для множества программ (я расскажу об этом в конце). Я хочу создать пользовательский сеттер в машинописном тексте, но тип данных устанавливаемого свойства - это не просто число, строка, bool, это фактически объект класса. Это отлично работает, но если свойство экземпляра класса модифицировано, то установщик не вызывается. Вот пример такой ситуации:(Typcript) Сеттер не вызывается в подсобстве экземпляра класса
//This class contains two properties
class Point
{
public x : number;
public y : number;
constructor(x : number, y : number) { this.x = x; this.y = 0; }
}
//How here is another class that contains a Point
//But it is private and a getter/setter is used
class PointStore
{
private _foo : Point;
public get foo() : Point { return this._foo; }
//Here is the problem, the setter is only called when the whole of foo is changed
public set foo(n : Point) { this._foo = n; console.log("Foo has been set!"); }
constructor() { this._foo = new Point(0, 0); }
}
//Use case
let bar : PointStore = new PointStore();
bar.foo = new Point(10, 10); //Logs "Foo has been set!"
bar.foo.x = 20; //Doesn't log anything
Проблема довольно ясно из приведенного примера, но я просто хочу сказать следующее:
Есть ли вообще обойти это вообще? Потому что я видел из интерфейсов, таких как Unity3D они решили сделать класс их «точка» есть только частные члены и поэтому данные могут быть установлены только через конструктор например:
//the 'Unity' solution
transform.position = new Vector2(10, 10); //Okay
transform.position.x = 20; //Error
Но это не совсем идеальное решение проблемы, поскольку с тех пор программирование с классом «Point» намного сложнее.
Если у кого-то есть трюк, чтобы решить эту проблему, было бы весьма полезно.
Вы ожидали сеттер 'bar.foo' быть вызывается при выполнении 'bar.foo.x'? –
Я знаю, что этого не произойдет, но как я могу заставить его вызвать сеттера? @NitzanTomer –
№. Setter вызывается только при назначении значения для свойства, но здесь вы используете getter для свойства. Почему вы хотите это сделать? Какова ваша цель? –