为简单起见,假设我有两个类:一个名为Car的类和一个名为Tires的集合类。轮胎是Car类中的嵌套类。我想让我的客户访问该集合 - 即他们应该能够迭代它:
foreach( var tire in car.tires ) ...
并访问每个轮胎的属性。但我不想让他们使用轮胎方法。我希望通过Car类来访问所有行为:
car.FillTires();
场景1:轮胎类是公共的,方法是私有的:汽车类无法访问轮胎方法。
场景2:轮胎类是私有的方法public:我无法将该集合公开给我的客户。
内部对我不起作用,因为我不想在程序集访问中授予其他类。
答案 0 :(得分:3)
创建一个只包含您希望客户端访问的方法的接口,并通过类的方法公开接口类型的集合。
答案 1 :(得分:3)
一个简单的解决方案是重新评估Tires
是否应该是一个内部类。如果您将其设为普通课程,则只需使用internal
和public
来区分哪些客户端和Car
可以访问的内容。
如果Tires
应该是内部类的原因不相关,则只显示只读版本:
Car
覆盖旧的实例。)Car
完全控制,同时限制公共访问,而不会给您带来任何不便或复制。答案 2 :(得分:2)
选项1:您可以将Car置于单独的程序集中并使用方案1ish(轮胎可以是公共+方法内部)。
选项2:你可以让轮胎不可变(比如String),让消费者用轮胎做他们想做的事,但他们不能改变车内的轮胎(让轮胎收集的属性只读)但是不要只读取私人支持字段。
答案 3 :(得分:0)
您可以编写扩展Tire的FakeTire类。
覆盖FillTires以在FakeTire类中抛出异常。汽车有一个真正的轮胎清单,但它的轮胎属性创建了一个Faketires列表给出。有点像只读集合。