gpt4 book ai didi

c# - 在不违反类型安全的情况下将不透明对象返回给调用者

转载 作者:太空狗 更新时间:2023-10-29 21:25:20 26 4
gpt4 key购买 nike

我有一个方法应该返回当前状态的快照,还有一个方法可以恢复该状态。

public class MachineModel
{
public Snapshot CurrentSnapshot { get; }
public void RestoreSnapshot (Snapshot saved) { /* etc */ };
}

状态 Snapshot 类对调用者应该是完全不透明的——没有可见的方法或属性——但它的属性必须在 MachineModel 类中可见。我显然可以通过向下转换来做到这一点,即让 CurrentSnapshot 返回一个 object,并让 RestoreSnapshot 接受一个 object 参数它会将其转换回 Snapshot

但是像那样强制转换让我觉得很脏。允许我既类型安全又不透明的最佳替代设计是什么?

更新解决方案:

我最终结合了已接受的答案和关于接口(interface)的建议。 Snapshot 类是一个公共(public)抽象类,在 MachineModel 中有一个私有(private)实现:

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);
}
}

因为 Snapshot 的构造函数和方法是内部的,来自程序集外部的调用者将其视为完全不透明的并且不能从它继承。程序集中的调用方可以调用 Snapshot.Restore 而不是 MachineModel.Restore,但这不是什么大问题。此外,在实践中,如果不访问 MachineModel 的私有(private)成员,您永远无法实现 Snapshot.Restore,这应该会阻止人们尝试这样做。

最佳答案

MachineModelSnapshot 可以在同一个程序集中,而调用者在不同的程序集中吗?如果是这样,Snapshot 可能是一个公共(public)类,但具有完全内部成员。

关于c# - 在不违反类型安全的情况下将不透明对象返回给调用者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2922458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com