Ich habe eine Methode, die eine Momentaufnahme des aktuellen Zustandes zurückkehren soll, und eine andere Methode, die diesen Zustand wieder her. keine sichtbaren Methoden oder Eigenschaften - -ohne Verletzung Typsicherheit
public class MachineModel
{
public Snapshot CurrentSnapshot { get; }
public void RestoreSnapshot (Snapshot saved) { /* etc */ };
}
Der Staat Snapshot
Klasse sollte dem Anrufer völlig undurchsichtig sein, aber seine Eigenschaften sichtbar in der MachineModel
Klasse. Ich konnte dies natürlich tun, indem einziehenden, das heißt haben CurrentSnapshot
Rückkehr ein object
und haben RestoreSnapshot
ein object
Argument akzeptieren, die es wieder zu einem Snapshot
wirft.
aber gezwungen Guss wie das macht mich schmutzig fühlen. Was ist das beste alternative Design, das mir erlaubt, sowohl typsicher als auch undurchsichtig zu sein?
Aktualisierung mit Lösung:
gewickelt ich über Schnittstellen zu tun, eine Kombination der akzeptierte Antwort und die Anregung auf. Die Snapshot
Klasse wurde eine öffentliche abstrakte Klasse, mit einer privaten Implementierung innerhalb MachineModel
gemacht:
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);
}
}
Da der Konstruktor und Methoden der Snapshot
internal
sind, können Anrufer von außerhalb der Baugruppe es als völlig undurchsichtig sehen und können von ihm nicht erben . Anrufer innerhalb der Baugruppe könnten Snapshot.Restore
statt MachineModel.Restore
anrufen, aber das ist kein großes Problem. Darüber hinaus könnte in der Praxis nie Snapshot.Restore
ohne Zugang zu MachineModel
‚s private Mitglieder implementieren, die die Menschen von dem Versuch, dies zu tun abbringen sollte.
'MachineModel' wird Anrufer sowohl innerhalb derselben Baugruppe als auch von außerhalb von Baugruppen haben. –