尽管 .Net 允许动态调用(例如采用反射、C# 中的 dynamic 关键字),但是当我们使用像 C# 这样的语言时,有时我们感觉有必要采用静态类型,以证明我们的程序是正确的,并且在运行时不会出现类型问题。
有时候,这导致我们引入接口或者基类,感觉它们只是为了向编译器解释,“是的,我知道我传递给该上下文的所有对象都将理解使用参数 Y 调用 invoke 方法 X - 在这里,我将使用接口定义来证明!” (例如——.net 内部使用 IReadChunkBytes 接口来允许将 SteamReadChunkBytes 或 BufferReadChunkBytes 对象传递给某个方法。)
其他时候,我们创建类或类型来服务于其他目的,这些目的并不感觉非常有用处,例如作为具有小附带行为的唯一标识符(有点像枚举值),或者用于保存一组常量等等。
我对更好地理解面对这种设计决策时的“编译时、运行时和其他成本”感兴趣,其中我会问自己,“我应该仅仅为了解决这个问题定义一个新类型或接口吗?” 显然,在每个这样的比较中,成本和收益将各自有两面,但是在一般情况下,我们应该希望看到“在每个这样的比较/讨论中定义新类型”的成本相同。 我们如何量化这些成本?