C# 空类型是一种糟糕的设计吗?

C# 空类型是一种糟糕的设计吗?,c#,unity3d,C#,Unity3d,我来自Python,正在提高我的技能,并且正在探索泛型。我在unity中建立了一个小“游乐场”,在这里我有以下设施: NM (NM) - sends power between machines | PM |--||--| PM | (PM) - distributes power internally | CC | | CC | (CC) - consumes power | CC | | CC | - generates

我来自Python,正在提高我的技能,并且正在探索泛型。我在unity中建立了一个小“游乐场”,在这里我有以下设施:

        NM          (NM) - sends power between machines
| PM |--||--| PM |  (PM) - distributes power internally
| CC |      | CC |  (CC) - consumes power
| CC |      | CC |       - generates power
机器具有消耗和产生“功率”的部件。 电源管理器(PM)了解机器中的所有组件(CC),并处理机器中的电源分配

然后,我想在不同的机器之间分配电源,因此我编写了一个NetworkManager(NM)类,这样连接机器的每个不同网络都有自己的管理器。然后,电源管理器可以向“网络”上的其他机器发送和请求电源

下一个合乎逻辑的步骤是使其通用化,这样我就不仅仅局限于电源。也许我想送水或暖气。我创建了两个类来替换PowerManager和仅限电源的NetworkManager:

ResourceManager<TResource> where TResource : Resource { ... }

NetworkManager<TResource> where TResource : Resource { ... }
ResourceManager其中TResource:Resource{…}
NetworkManager,其中TResource:资源{…}
这看起来很棒,因为现在可以创建一个管理器来处理机器所需的任何资源。然而,这里的警钟是我的
资源
超类及其子类是完全空的。我不需要它们,只是因为它们是一种类型,定义了管理者处理的资源。我考虑了一种“严格类型”的方法,通过尝试
newresourcemanager(“power”)
并根据字符串名称匹配资源类型,但它并不僵化,我希望避免可能由拼写错误等引起的编译时错误


因此,总结一下:如何在不创建空的
Electrical:Resource
类的情况下创建一个
新ResourceManager()
?或者这是一种可以接受的解决问题的方式?我觉得我可能在扩展泛型的意图。

我看不出它有什么内在的错误。其他选项是创建一个接口(即IResource),您的资源类可以像其他类一样实现该接口(如有必要),然后您只需:

ResourceManager<IResource>
NetworkManager<IResource>
ResourceManager
网络管理员

使用该接口的一些好处包括,在对代码运行单元测试时可以使用模拟。

我看不出它有什么固有的问题。其他选项是创建一个接口(即IResource),您的资源类可以像其他类一样实现该接口(如有必要),然后您只需:

ResourceManager<IResource>
NetworkManager<IResource>
ResourceManager
网络管理员

界面的一些好处包括,在对代码运行单元测试时可以使用模拟。

这基本上只是特例模式的一个版本,也是我经常做的事情。我还发现空类型很少保持为空。因此它有一个名称!这是个好兆头。你可能说得对,它也不会保持为空。这基本上只是特例模式的一个版本,我经常这样做。我还发现空类型很少保持为空。因此它有一个名称!这是个好兆头。你说的可能是对的,它也不会保持为空。我考虑过这样做,但意识到(当时)我没有任何函数可以放进去。然而,正如James在他的评论中提到的,它很可能不会长时间保持为空,所以我会将其标记为正确。我曾考虑过这样做,但意识到(当时)我没有任何函数可以放入其中。然而,正如詹姆斯在他的评论中提到的,它很可能不会长时间保持为空,所以我将把它标记为正确的。