在Ruby,我有一个DAO类,它是由一类使得管理更容易的连接,这是由表示和在DB中,这是由另一类进一步扩展操纵数据的类扩展延长。 要使用动物比喻它是这样的:
class Animal
...
end
class Mammal < Animal
...
end
class Feline < Mammal
...
end
class Cat < Feline
...
end
class Lion < Cat
...
end
...
在PHP中,有__destruct
,当你破坏/删除类运行方法。 而应该是类扩展另一个类,只需添加parent::__destruct()
到类的__destruct
这样的方法:
public function __destruct() {
// Clean up code for this class here
...
// Execute clean up code for Parent class
parent::__destruct();
}
我可能对除所有类相似的方法Animal
。 因为它不延长的话,就是parent::__destruct();
线不再有效。
不过,据我所知,Ruby没有像这样的对象的方法。 终结器可设定,但我决定只是把一个cleanup
方法我可以调用每当我要毁掉/删除一个类。 这将采取任何必要的类我的设置之前做保健nil
。
这虽然提出了一个新的问题。 如果方法总是被命名为cleanup
和我打电话lion_instance.cleanup
,我认为它会调用Lion#cleanup
。 那么,如何得到它来调用cleanup
类Cat
,然后Feline
和环比下跌?
或者这是一种错误的做法,你有更好的想法?
Ruby的成语,这是屈服于它不工作的模块,并且当块的回报,做清理。 Ruby的内置“File.open”做到这一点:
File.open("/tmp/foo") do |file|
file.puts "foo"
end
当块结束时,文件被关闭了你,没有你做任何事情。 这是一个很好的习惯用法。 这里是你将如何实现这样的事情:
class Foo
def self.open(*args)
foo = new(*args)
yield foo
foo.close
end
def initialize
# do setup here
end
def close
# do teardown here
end
end
并使用它:
Foo.open do |foo|
# use foo
end
Foo#close
自动将后引起的end
这将与子类正常工作。 这是因为类方法继承,就像是实例方法。 这里的超类:
class Superclass
def self.open(*args)
o = new(*args)
yield o
o.close
end
def initialize
# common setup behavior
end
def close
# common cleanup behavior
end
end
和两个派生类:
class Foo < Superclass
def initialize
super
# do subclass specific setup here
end
def close
super
# do subclass specific teardown here
end
end
class Bar < Superclass
def initialize
super
# do subclass specific setup here
end
def close
super
# do subclass specific teardown here
end
end
使用方法:
Foo.open do |foo|
# use foo
end
Bar.open do |bar|
# use bar
end
如果你真的需要确保清理发生的无论是什么,然后使用确保在类方法子句:
def self.open(*args)
foo = new(*args)
begin
yield foo
ensure
foo.close
end
end
这样一来,清理情况即使在块异常。
您可以使用ObjectSpace.define_finalizer
就像是:
class Animal
def initialize
ObjectSpace.define_finalizer(self, proc { # your code })
end
end
好了,因为没有人回答你的问题有关该方法的移动它的方式继承链...
class Cat
def rawr
puts "rawr"
end
end
class Kitty < Cat
def rawr
puts "meow"
super
end
end
Cat.new.rawr
"Rawr"
Kitty.new.rawr
"rawr"
"meow"
在一个方法,你可以通过调用超级访问父类的同名方法。