Tengo un método que debe devolver una instantánea del estado actual y otro método que restablece ese estado.Devolver un objeto opaco a la persona que llama sin violar la seguridad de tipo
public class MachineModel
{
public Snapshot CurrentSnapshot { get; }
public void RestoreSnapshot (Snapshot saved) { /* etc */ };
}
La clase Snapshot
estado debe ser completamente opaca a la persona que llama - no hay métodos o propiedades visibles - pero sus propiedades tienen que ser visibles dentro de la clase MachineModel
. Obviamente, podría hacer esto mediante downcasting, es decir, tener CurrentSnapshot
devolver un object
, y tener RestoreSnapshot
aceptar un argumento object
que devuelve a Snapshot
.
Pero la fundición forzada de esa manera me hace sentir sucio. ¿Cuál es el mejor diseño alternativo que me permite ser seguro y opaco?
actualización con solución:
terminé haciendo una combinación de la respuesta aceptada y la sugerencia acerca de las interfaces. La clase Snapshot
se hizo una clase abstracta pública, con una puesta en práctica privada en el interior MachineModel
:
public class MachineModel
{
public abstract class Snapshot
{
protected internal Snapshot() {}
abstract internal void Restore(MachineModel model);
}
private class SnapshotImpl : Snapshot
{
/* etc */
}
public void Restore(Snapshot state)
{
state.Restore(this);
}
}
Debido a que el constructor y los métodos de Snapshot
son internal
, las personas que llaman desde el exterior del conjunto lo ven como una completamente opaca y no puede heredar de ella . Las personas que llaman dentro del conjunto pueden llamar al Snapshot.Restore
en lugar de a MachineModel.Restore
, pero eso no es un gran problema. Además, en la práctica, nunca podría implementar Snapshot.Restore
sin acceso a los miembros privados de MachineModel
, lo que debería disuadir a las personas de tratar de hacerlo.
'MachineModel' tendrá llamantes tanto desde dentro del mismo conjunto como desde ensamblajes externos. –