我想代表一个电视国家代码(如瑞典46或阿根廷54 )。这是一个小的正整数。
1)子类SmallInteger
是建模的好主意吗?
在代码浏览器中尝试此操作时,我得到:
SmallInteger immediateSubclass: #CountryCode
2)我不知道immediateSubclass:
是什么意思,而不是subclass:
。
3)如何创建CountryCode
的实例?因为SmallIntegers
只能通过算术创建?
我知道我可以使用封装,只需在我自己的CountryCode
类中拥有一个CountryCode
。
谢谢!
发布于 2019-04-27 00:00:59
SmallInteger
这样的核心类的子类不是一个好主意(而且可能根本不起作用),因为有2immediateSubclass:
的类是VM处理的特例子类。该值不是对象指针,而是直接存储在对象标头中。我认为VM需要了解每种特定类型的immediateSubclass:
来处理编码/解码/JIT代码生成。#isKindOf:
等进行测试,它本身可能还不足以完全令人信服地作为一个数字。如果您真的想要这样做,您可能希望使您的类成为一个Integer
的子类,其中包含您的数值ivar,然后再做所有您将对其进行代理的正常操作。(也就是说,要么创建性能和调试所需的所有方法,要么实现#doesNotUnderstand:
,将消息转发给它并与缺点共存)这就是说,问问自己,为什么你真的需要这样做作为一个国家的代码?是的,这是一个数字,但是你真的要用它做数字的事情吗?(把两个国家代码加在一起,国家代码* 10,一个国家代码的平方根意味着什么,等等)。您需要专门化,还是代码只是一个没有特殊行为的数值?我怀疑更好的解决方案是创建一个Country或CountryCode类作为Object
或其他顶级模型类的子类。然后,您可以为国家代码(很可能是SmallInteger)添加一个ivar,为国家名称添加另一个ivar,并在需要时向其中添加一个#asInteger
或#asNumber
方法。
发布于 2019-04-26 23:57:19
1)从整数继承有什么好处?对国家代码执行算术?一个国家的代码完全需要一个类吗?为了什么行为?
2)直接子类是一个实现细节。普通对象是指针(面向对象的指针)。直接对象包含数据而不是指针。虚拟机通过低位非零来识别它们。普通地址对齐为4、8或16字节,并将低位设置为零。
3)不能创建即时对象,不能分配内存(新的),也不能对它们进行子类。只有VM可以,是的,这总是通过算术为SmallInteger。
所以是的,作文可能是你所需要的。Country有一个小整数的telefon代码(在实例变量中),还可能有其他特性(名称.)。
发布于 2019-04-27 03:11:17
例如,将国家代码封装在类TelephoneNumber
中就足够了,不是吗?
我想您可能需要国家和代码之间的映射,还需要一些工具来解析和验证电话号码字符串。我不认为有必要在自己的类中对代码进行建模。
因此,我会尝试封装,并坚持到被证明是错误的(这应该是显而易见的)。
https://stackoverflow.com/questions/55875720
复制相似问题