子类化 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 的算术。
所以是的,合成可能就是您所需要的。国家有一个小的整数电话代码(在一个实例变量中),也可能有其他特征(一个名字......)。
在可能的情况下,合成通常优于子class。子classing一个核心class喜欢
由于 2
,SmallInteger
尤其不是一个好主意(并且可能根本不起作用)
类 定义为 immediateSubclass:
是处理特殊情况子 classes
由虚拟机。该值直接存储在 object header 中,而不是 object 指针。我相信 VM 需要了解每种特定类型的
一个 immediateSubclass:
来处理 encoding/decoding/JIT 代码
世代.
您已经开始发现创建数字子项的问题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.
中对代码建模
因此,我会尝试封装,并坚持使用它直到被证明是错误的(这应该会变得很明显)。
- 不,将国家/地区代码作为 SmallInteger 的子class 不是一个好主意。
- 不知道这种情况下‘immediate subclass’是什么意思。让我们暂时忽略这一点。
假设您将 TelephoneCountry 创建为 Object 的子class;并且您使用选择器 #code 创建了一个 class 方法:创建一个新实例,将名为“code”的实例变量设置为参数的值,并 returns 新实例。您可以将该消息发送到您的 class 以创建 TelephoneCountry 实例,如下所示:
国家:=电话国家代码:46。
您稍后可能会询问该国家/地区的名称或代码。
n := 国家名称。
c := 国家代码。
当然,您也需要编写每个方法。
我想代表一个电话国家代码(例如瑞典的 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 的算术。
所以是的,合成可能就是您所需要的。国家有一个小的整数电话代码(在一个实例变量中),也可能有其他特征(一个名字......)。
-
在可能的情况下,
合成通常优于子class。子classing一个核心class喜欢 由于 2
,类 定义为
immediateSubclass:
是处理特殊情况子 classes 由虚拟机。该值直接存储在 object header 中,而不是 object 指针。我相信 VM 需要了解每种特定类型的 一个immediateSubclass:
来处理 encoding/decoding/JIT 代码 世代.您已经开始发现创建数字子项的问题class。 (还会有其他人)您可以创建一个 Object subclass 并让它代理一个数字 ivar,但如果您的 object 用
#isKindOf:
等进行测试。如果您 真的 想要这样做,您可能希望将您的 class 设为子 classInteger
里面有你的数字ivar,然后做你会做的所有正常的事情来代理它。 (即要么创建性能和调试所需的所有方法,要么实现#doesNotUnderstand:
将消息转发给它并接受缺点)
SmallInteger
尤其不是一个好主意(并且可能根本不起作用)
就是说,问问自己为什么真的需要为国家/地区代码执行此操作?是的,它是一个数字,但你真的要用它做一些你需要专门研究的数字事情吗(将两个国家代码加在一起,国家代码 * 10,国家代码的平方根甚至意味着什么等等)代码只是一个没有特殊行为的数值?我怀疑更好的解决方案是创建一个 Country 或 CountryCode class 作为 Object
的子 class 或其他一些顶级模型 class。然后,您可以为国家代码添加一个 ivar(很可能是 SmallInteger),另一个为国家名称等添加一个 ivar,并在需要时向其添加 #asInteger
或 #asNumber
方法。
将国家代码封装在 class TelephoneNumber
中应该就足够了,不是吗?
我想您可能需要国家和代码之间的映射,还需要一些工具来解析和验证电话号码字符串。我没有看到需要在自己的 class.
中对代码建模因此,我会尝试封装,并坚持使用它直到被证明是错误的(这应该会变得很明显)。
- 不,将国家/地区代码作为 SmallInteger 的子class 不是一个好主意。
- 不知道这种情况下‘immediate subclass’是什么意思。让我们暂时忽略这一点。
假设您将 TelephoneCountry 创建为 Object 的子class;并且您使用选择器 #code 创建了一个 class 方法:创建一个新实例,将名为“code”的实例变量设置为参数的值,并 returns 新实例。您可以将该消息发送到您的 class 以创建 TelephoneCountry 实例,如下所示:
国家:=电话国家代码:46。
您稍后可能会询问该国家/地区的名称或代码。
n := 国家名称。 c := 国家代码。
当然,您也需要编写每个方法。