嵌套类的难题

时间:2009-09-23 20:47:42

标签: c# .net oop

为简单起见,假设我有两个类:一个名为Car的类和一个名为Tires的集合类。轮胎是Car类中的嵌套类。我想让我的客户访问该集合 - 即他们应该能够迭代它:

foreach( var tire in car.tires ) ...

并访问每个轮胎的属性。但我不想让他们使用轮胎方法。我希望通过Car类来访问所有行为:

car.FillTires();

场景1:轮胎类是公共的,方法是私有的:汽车类无法访问轮胎方法。
场景2:轮胎类是私有的方法public:我无法将该集合公开给我的客户。
内部对我不起作用,因为我不想在程序集访问中授予其他类。

4 个答案:

答案 0 :(得分:3)

创建一个只包含您希望客户端访问的方法的接口,并通过类的方法公开接口类型的集合。

答案 1 :(得分:3)

一个简单的解决方案是重新评估Tires是否应该是一个内部类。如果您将其设为普通课程,则只需使用internalpublic来区分哪些客户端和Car可以访问的内容。

如果Tires应该是内部类的原因不相关,则只显示只读版本:

  • 暴露像CMP建议的副本(不需要是一个不同的类,虽然它确实更好,所以你可以抛出异常)。我至少喜欢这个建议,因为拥有一个看起来像你可以改变它的类是不够优雅的。但实际上你不能。
  • 像Danny建议的那样使整个类不可变,这是有效和整洁的,但是处理起来不太方便(每当你想要改变某些东西时需要用Car覆盖旧的实例。)
  • 仅通过Asaph建议的只读界面公开课程。我最喜欢这个,因为它允许Car完全控制,同时限制公共访问,而不会给您带来任何不便或复制。

答案 2 :(得分:2)

选项1:您可以将Car置于单独的程序集中并使用方案1ish(轮胎可以是公共+方法内部)。

选项2:你可以让轮胎不可变(比如String),让消费者用轮胎做他们想做的事,但他们不能改变车内的轮胎(让轮胎收集的属性只读)但是不要只读取私人支持字段。

答案 3 :(得分:0)

您可以编写扩展Tire的FakeTire类。

覆盖FillTires以在FakeTire类中抛出异常。汽车有一个真正的轮胎清单,但它的轮胎属性创建了一个Faketires列表给出。有点像只读集合。