Đa kế thừa trong ruby

Ruby không cho phép một class đa kế thừa. Ruby dùng cơ chế Mix-in để mix-in các module lại

Notes:

Mix-in: cơ chế cho phép multi-inheritance

Mix-in làm tăng khả năng tái sử dụng code và giải quyết được vấn đề “diamond problem” trong multi-inheritance

Mix-in có thể xem như interface trong C#, java,…chỉ có điều các method của nó đã được implement

  • module nào được include sau thì sẽ được tìm kiêm method của module đó trước

Ref: inheritance

public, private, protected

Ref: private_protected

Trong ruby lớp kế thừa có thể gọi hàm private của lớp cha

class A
def main_method
method1
end

private
def method1
puts “hello from #{self.class}”
end
end

class B < A
def main_method
method1
end
end

A.new.main_method
B.new.main_method

hello from A
hello from B

Tuy nhiên, gọi bằng self thì không được

class C < A
def main_method
self.method1
end
end
C.new.main_method

>>>> a.rb:36:in `main_method’: private method `method1′ called for #<C:0x7f67025a0648> (NoMethodError)

Nếu thay private bằng protected thì okay

class A
def main_method
method1
end

protected
def method1
puts “hello from #{self.class}”
end
end

class B < A
def main_method
method1
end
end

class C < A
def main_method
self.method1
end
end

hello from A
hello from B
hello from C

Tuy nhiên nếu class D không kế thừa từ class A thi sẽ bị lỗi

class D
def main_method
B.new.method1
end
end

D.new.main_method

rb:39:in `main_method’: protected method `method1′ called for #<B:0x7fe81d00efa8> (NoMethodError)

Advertisements

One thought on “Đa kế thừa trong ruby

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s