Come dovrei passare un'istanza di classe limitata

0

Con OOP, qual è il modo consigliato per passare un'istanza di una classe che è limitata, come proprietà di sola lettura o meno metodi disponibili.

Di seguito è riportato un Vector2 , che contiene più metodi per manipolare le sue proprietà come i setter o la funzione add .

class Vector2 {
  private _x: number = 0;
  private _y: number = 0;

  public get x () {
    return this._x;
  }

  public get y () {...}

  public set x (x: number) {
    this._x = x;
  }

  public set y (y: number) {...}

  public add (v: Vector2) {
    this._x += v.x;
    this._y += v.y;
  }
}

Come potrei passare una versione limitata di questa istanza, ad esempio un% di sola lettura% con solo i getter disponibili. La soluzione che ho avuto è quella di creare un'altra classe separata che chiamerò Vector2 che avvolge un Vector2RO , ma sento che potrebbe esserci un modo "migliore" o più "elegante" per farlo.

class Vector2RO {
  private _v: Vector2;

  public constructor (v: Vector2) {
    this._v = v;
  }

  public get x () {
    return this._v.x;
  }
}
    
posta Alex 15.03.2018 - 22:27
fonte

1 risposta

1

In C ++, utilizzerei solo un riferimento const . Nelle lingue senza tali qualificatori di tipo, un decoratore o un wrapper come te suggerito è l'approccio standard. Conosco esempi simili in Python o Java.

È importante riflettere sulla relazione tra un wrapper readonly e l'oggetto mutabile. Dovrebbero condividere un'interfaccia? Il fatto è che l'oggetto mutabile implementerà anche tutti i metodi che fanno parte dell'interfaccia di sola lettura. Quindi potrebbe avere senso avere Vector2 implementare l'intefaccia Vector2ReadOnly . D'altra parte, Vector2 è non di sola lettura e l'implementazione di tale interfaccia sarebbe altamente fuorviante.

La mia raccomandazione sarebbe di evitare l'ereditarietà e invece di usare una classe completamente indipendente per il wrapper di sola lettura. In alternativa, l'interfaccia dovrebbe chiarire che l'oggetto non è immutabile, ma che questa interfaccia contiene semplicemente i getter o la parte di sola lettura dell'interfaccia. Vector2Getters potrebbe essere un nome accurato sebbene piuttosto scomodo.

    
risposta data 15.03.2018 - 22:46
fonte

Leggi altre domande sui tag