Answers:
我不会将其称为“很少使用的设计机制”-至少不是通用的:尽管在有些商店中,有些贡献者可能不喜欢使用嵌套类,但这根本不是一个晦涩的功能。
尽管存在具有汇编可见性的类以及引入lambda大大减少了对嵌套类*的需求,但它们仍然是有效的设计选择。尽管名称空间中的内部类有些重叠,但是嵌套类功能是独特的,它使您可以将一个类完全隐藏在另一个类中。
*在Java中使用类似功能要高得多,因为Java中没有C#中可用的其他替代方法。
考虑一下,您正在另一个类中编写一个类,该类将永远不会在程序的其他任何地方使用。因为如果您在其他地方使用它,则将其设为普通的公共类,就像其他所有类一样。
因此,这里没有应该使OOP变得更好(可重用)的东西。此外,使用嵌套类可以实现什么,而使用父类中的普通方法和私有成员则无法实现?
am I going down an inherintly bad path
我认为在您的第二个示例(工人子类)中,您肯定是。您已将每个子类映射到超类中的特定状态。因此,现在每次您要将状态添加到超类时,都需要在三个位置进行更改(将状态添加到超类,添加新的子类,并更改派生类的构造函数以将子类添加到列表中)。
使用嵌套类访问私有成员确实是一种有效的用法(我从未亲自这样做),但是您的特定情况在这里不起作用。
至于身体部位的例子。因为所有嵌套类都是公共的,所以除了命名空间之外,您实际上并没有做太多事情。如果这些类成长为包含更多功能,则您可能会发现嵌套类只会使接口混乱,并且正在筛选代码以查找特定的内容。我还注意到,因为您有嵌套的类,所以您不得不打破命名约定,并用小写字母命名类(也许这是一个选择)。但是这些论点比任何实际错误都更肤浅。
除非,当然,除非您需要实施一个不具体的手臂。然后执行以下操作来创建手臂会造成混乱,因为没有身体/躯干/侧面。(另请注意混乱的外壳)。
arm newArm = new Body.torso.side.arm("");
以我的经验,嵌套类
对您的课程进行了简短的了解,我认为:
为什么不将您的类分为多个类,并为它们提供单独的名称空间。例如
WindowsGame1.PhysicalModel.UpperBody
WindowsGame1.PhysicalModel.LowerBody
WindowsGame1.PhysicalModel.UpperBody.Arms