作者adrianshum (Alien)
看板java
标题Re: [问题] 关於 nested enum
时间Thu Mar 6 17:43:30 2008
※ 引述《huge (huge)》之铭言:
: 抱歉,本篇文章回应 qrtt1 及 alien 板友的回答 ^^
: 首先,在method传递的时候,确实无法将 BigType.MiddleType1.A 视为是一个 BigType
: 而是一个 MiddleType1
: 因此,在这个 abstract class 下,如果我有 MiddleType1 以及 MiddleType2 的 Enum class
: 那麽在method传递过程中,就只能依照所有的 Enum class 去进行 overload
: 例如
: public void ProcessEnum(MiddleType1 mt1)
: public void ProcessEnum(MiddleType2 mt2)
: 而不能单纯地使用
: public void ProcessEnum(BigType bt)
: 去处理所有 BigType 这个 class 下的所有 Enum class
: <D>: : 然而要在method中传递这个 BigType.MiddleType1.A 的时候
: : 你意思是你想把它视为 BigType 还是怎样?..
: 是的!!!!
那这就是 is-a 的关系, 代表你想做 inheritence 了
: : 这个不会是同一个吧.
: : BigType.MiddleType1 和 BigType.MiddleType2 是不同的 enum (class).
: : 两者的 A 虽然名字一样但不可能是同一个值.
: : 如果你说的是其 Ordinal value or string value, 这个
: : 与 nested 与否就没关系了
: 嗯,我表达的不完整,应该说这两个值会有一样的可能性 (ordinal value)
因为那是两个不同的 enum, 有一样的 ordinal value 也正常呀.
还有你不该依赖 ordinal value 去处理吧, enum 本身就是
一个好好的 type.
: 上面的例子可能不够容易说明,举个最近Java板流行的例子好了
: 小弟想用 nested enum 的原因如下
: 忍者 {
: public enum 火影村 {
: [DescriptionAttribute("奶奶")]
: 纲手,
[43]
: }
: }
: 所以,如果我想利用DescriptionAttribute取得某个忍者的中文说明
: 那麽,便得知道这个忍者是属於火影村、风影村、甲贺、或是伊贺了
: 在处理上就麻烦许多 :(
: 不知道这样的例子大家能不能接受 ^^"
简单来答一句就是这种情况不该用 enum, 因为
1) enum 是很 static 的东西, 但明显你的例子中的忍者们
该是 Object instance 而非 enum
2) 甲贺伊贺 etc 也该是 object 的 attribute 而非 enum
的 "type". 你不能单以一句 "方便" 就乱来的吧? :)
3) 既是 is-a 关系, 你用火影村也不对, 火影村 并非 "is-a" 忍者
其实我比较倾向你提供一个真实 real life 的 example.
忍者火影村这个例子在现在这个情况下并不是很合理的
例子. 有一个真实例子我想大家才能告诉你怎样做会比
较合理.
一般的 enum inheritence 做的也只是基於某 enum
再新增新的 enum value. 但这也有一些 ambiguity
要 resolve.
e.g.
enum OrderState {
RECEIVED,
PROCESSING,
DELIVERED
}
enum PreOrderState extends OrderState {
GOODS_RESERVED
}
类似这种.
但这种的 inheritence 和 class/object 又不太一样了.
比如, OrderState.values 我究竟应不应该
包括 PreOrderState.GOODS_RESRVED?
一个method parameter 要接收一个 OrderState,
你传一个 PreOrderState 进去又合理吗?
细心想想你就会发觉这类 inheritence 是有点古怪的东西.
alien
alien
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.155.236.82
1F:推 huge:感谢,思考继承中 >_< 03/06 23:22
2F:推 qrtt1:思考用集合来搞定吧:P 03/07 14:25