我在 C# 中有一个类层次结构,描述了一些数据结构。有一些基类,它们自动执行一些一般任务,在它们之上还有专门的类,它们反映了实际的结构。
我希望该结构只能加载一次。如果您加载它 - 或修改它的任何字段 - 加载应该不再可用。
我想出了三个解决方案:
创建一个标志
bool loaded
字段并在加载(或更改)类时设置它。优点:不需要改变结构,直接使用(
new
+.Load()
)缺点:我必须努力在整个结构中传播这个标志,并且通常会照顾它,以便在每一种可能的情况下都会更新它。此外,这是运行时解决方案(第二次加载 = 异常),而我总是更喜欢编译时解决方案。
将加载移动到类的构造函数,这样可以创建一个空结构或创建它并在之后立即加载。
优点:编译时解决方案:任何时候都无法简单地加载结构。
缺点:加载依赖于派生类,无法在构造函数中调用虚方法,这使事情变得复杂。这可以被克服,但代价是界面的简单性。也发生了,在加载时,我必须返回一个对象,这需要 ctor 有一个
out
参数(无论如何这似乎是必要的)。创建类工厂,隐藏 ctor 并提供工厂方法来创建空的和预加载的结构。
优点:编译时解决方案。工厂可以通用以涵盖所有派生类
缺点:复杂的代码和不直观的界面(工厂创建事物的方式比操作员不太明显
new
)。此外,此解决方案依赖于internal
修饰符来使结构和工厂成为朋友。
我的问题是:
- 有没有更好的方法来防止多次加载结构?
- 或者:有没有办法克服提议的解决方案的缺点?
编辑:回应答案
将我的结构想象为 Word 文档或 Excel 表。Word 文档只能加载一次,您不能在已加载的文档上“调用加载”。这是我想要的一种安全措施。换句话说,我想阻止某人打电话:
MyStructure s = new MyStructure();
s.Load("file1.str");
s.Load("file2.str"); // Doesn't make sense
并且:
MyStructure s = new MyStructure();
s.SomeProperty = 15;
s.Load("file1.str"); // Doesn't make sense