子类化 SmallInteger 来表示数字事物?

Subclassing SmallInteger for representing numerical things?

我想代表一个电话国家代码(例如瑞典的 46 或阿根廷的 54)。这是一个小的正整数。

1) subclassing SmallInteger 是建模的好主意吗?

在代码浏览器中尝试此操作时,我得到:

SmallInteger immediateSubclass: #CountryCode

2) 我不知道 immediateSubclass: 是什么意思,对比 subclass:.

3) 如何创建 CountryCode 的实例?因为 SmallIntegers 只能通过算术创建?

我知道我可以使用封装并且在我自己的 CountryCode 中有一个 SmallInteger class.

谢谢!

1) 从整数继承有什么好处?对国家代码进行算术运算?国家代码是否需要 class?针对哪种行为?

2) immediate subclass 是一个实现细节。普通对象是指针(面向对象的指针)。立即对象包含数据而不是指针。它们通过具有非零的低位被虚拟机识别。普通地址按 4 8 或 16 字节对齐,低位设置为零。

3) 不能创建直接对象,不能分配内存(新),也不能子class它们。只有 VM 可以,是的,这总是通过 SmallInteger 的算术。

所以是的,合成可能就是您所需要的。国家有一个小的整数电话代码(在一个实例变量中),也可能有其他特征(一个名字......)。

    在可能的情况下,
  1. 合成通常优于子class。子classing一个核心class喜欢 由于 2

  2. SmallInteger 尤其不是一个好主意(并且可能根本不起作用)
  3. 类 定义为 immediateSubclass: 是处理特殊情况子 classes 由虚拟机。该值直接存储在 object header 中,而不是 object 指针。我相信 VM 需要了解每种特定类型的 一个 immediateSubclass: 来处理 encoding/decoding/JIT 代码 世代.

  4. 您已经开始发现创建数字子项的问题class。 (还会有其他人)您可以创建一个 Object subclass 并让它代理一个数字 ivar,但如果您的 object 用 #isKindOf: 等进行测试。如果您 真的 想要这样做,您可能希望将您的 class 设为子 class Integer 里面有你的数字ivar,然后做你会做的所有正常的事情来代理它。 (即要么创建性能和调试所需的所有方法,要么实现 #doesNotUnderstand: 将消息转发给它并接受缺点)

就是说,问问自己为什么真的需要为国家/地区代码执行此操作?是的,它是一个数字,但你真的要用它做一些你需要专门研究的数字事情吗(将两个国家代码加在一起,国家代码 * 10,国家代码的平方根甚至意味着什么等等)代码只是一个没有特殊行为的数值?我怀疑更好的解决方案是创建一个 Country 或 CountryCode class 作为 Object 的子 class 或其他一些顶级模型 class。然后,您可以为国家代码添加一个 ivar(很可能是 SmallInteger),另一个为国家名称等添加一个 ivar,并在需要时向其添加 #asInteger#asNumber 方法。

将国家代码封装在 class TelephoneNumber 中应该就足够了,不是吗?

我想您可能需要国家和代码之间的映射,还需要一些工具来解析和验证电话号码字符串。我没有看到需要在自己的 class.

中对代码建模

因此,我会尝试封装,并坚持使用它直到被证明是错误的(这应该会变得很明显)。

  1. 不,将国家/地区代码作为 SmallInteger 的子class 不是一个好主意。
  2. 不知道这种情况下‘immediate subclass’是什么意思。让我们暂时忽略这一点。
  3. 假设您将 TelephoneCountry 创建为 Object 的子class;并且您使用选择器 #code 创建了一个 class 方法:创建一个新实例,将名为“code”的实例变量设置为参数的值,并 returns 新实例。您可以将该消息发送到您的 class 以创建 TelephoneCountry 实例,如下所示:

    国家:=电话国家代码:46。

    您稍后可能会询问该国家/地区的名称或代码。

    n := 国家名称。 c := 国家代码。

当然,您也需要编写每个方法。