Project1

标题: 能不能同时兼有子类 [打印本页]

作者: hys111111    时间: 2014-5-3 10:19
标题: 能不能同时兼有子类
class Game_Event < Game_Character

class Game_Player < Game_Character
Game_Event和Game_Player都是Game_Character的类。

我为了方便计算,能不能让一个Game_Character同时是Game_Event和Game_Player,
即if self.is_a?(Game_Player)和self.is_a?(Game_Event)都为true?
作者: 浮云半仙    时间: 2014-5-3 10:29
我能说你改用unless语句么?
作者: 浮云半仙    时间: 2014-5-3 10:32
class A
end
class B<A
end
A.is_a?(B)  #false
B.is_a?(A)  #false
作者: kuerlulu    时间: 2014-5-3 11:32
标题: 重编辑
本帖最后由 kuerlulu 于 2014-5-3 11:49 编辑

很简单,让player继承event,不过不保证不出错
class A; end
class B < A; end
class C < B; end
B.new.is_a?(A) #true
C.new.is_a?(B) #true
C.new.is_a?(A) #true
不好意思,理解错意思了
一个父类的对象是不能is_a?它的子类获得true的
不过你可以在父类里面故意定义这个方法,如果只是想看起来像的话
class A
alias self.is_a? is_a?0xBE
def self.is_a?(*args)
   if args[0] == B or args[0] == C then return true end
   is_a?0xBE(*args)
end
end
作者: yagami    时间: 2014-5-3 19:24
本帖最后由 yagami 于 2014-5-3 19:33 编辑

话说继承不是这么用的 class 猫 < 动物
calss 狗 <动物
你可以说 猫和狗是动物 但不能说动物是 猫狗
Game_Character既然被拿出来当父类 说明他有很多公共的部分 可以供Game_Event 和 Game_Player
但 后面2个子类 也有自己独有的部分 其实按你的意思  就是把这3个写在一起  把 子类的变量和函数都写到父类里去 这样就达到你的目的了 但这样的话 首先代码不方便扩展 其次会有内存浪费 比如 Game_Event 要个int 变量xxx 但 Game_Player 里完全用不到 虽然可以用个类似类型的参数 使同一个变量 在不同场合做不同的事情 但这样的代码可读性非常差

顺便补充一点 lz不嫌内存浪费的话 可以用组合的方式
class CharacterBase
attr_accessor : a
attr_accessor : b
def initialize(a,b)
@a=a
@b=b
end
end

a b 代表Game_Event 和 Game_Player的实例 如果只需要1个参数 另一个传nil  用起来就
CharacterBase t = new CharacterBase
t.a.xx if t.a !=nil
t.b.xx if t.b !=nil
作者: hys111111    时间: 2014-5-4 12:37
算了,我另外想别的办法了。




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1