2013-02-08 30 views
47

Giả sử tôi có một lớp học AB trong đó B được thừa kế A. Làm thế nào để in tên lớp cha mẹ trong BLàm cách nào để có tên lớp của phụ huynh trong Ruby

class A 
end 

class B < A 
end 

Một số điều tôi đã cố gắng

>> B.new.class #=> B #which is correct 
>> B.new.parent #=> Undefined method `parent` 
>> B.parent #=> Object 
>> B.parent.class #=> Class 

Cảm ơn :)

+3

khi bị mắc kẹt như thế này luôn cố gắng 'B.methods.sort' trong IRB. Có lẽ một cái gì đó sẽ cung cấp cho bạn một đầu mối về tên phương pháp bạn tìm kiếm. –

+0

@IvayloStrandjev Điều đó sẽ không giúp ích gì. Có quá nhiều phương pháp để xem xét. Đó là sự lãng phí thời gian. – sawa

+0

@sawa không đúng. Mất 30 giây. Đủ cho những người dùng khác nhanh hơn tôi, nhưng khá nhanh. –

Trả lời

83
class A 
end 

class B < A 
end 

B.superclass # => A 
B.superclass.name # => "A" 
8

Thuật ngữ mà bạn đang tìm kiếm là superclass. Và thực sự bạn có thể làm B.superclass để nhận được A. (Bạn cũng có thể làm B.ancestors để có được một danh sách tất cả các lớp học và các module nó được thừa hưởng từ -. Cái gì đó như [B, A, Object, Kernel, BasicObject])

14

Với một đối tượng (khởi tạo lớp), bạn có thể lấy được phụ huynh lớp

>> x = B.new 
>> x.class.superclass.name 
=>"A" 
40

Nếu bạn muốn đầy đủ tổ tiên chồng thử:

object.class.ancestors 

Ví dụ:

> a = Array.new 
=> [] 
> a.class.ancestors 
=> [Array, Enumerable, Object, Kernel, BasicObject] 
11

Trong trường hợp google mang đến bất kỳ ai ở đây đang làm việc trong Rails, những gì bạn có thể muốn thay thế là base_class, vì superclass cũng sẽ đi qua cấu trúc thừa kế ActiveRecord.

class A < ActiveRecord::Base 
end 

class B < A 
end 

> A.superclass 
=> ActiveRecord::Base 
> B.superclass 
=> A 

> A.base_class 
=> A 
> B.base_class 
=> A 

Thậm chí hơn nữa ...

class C < B 
end 

> C.base_class 
=> A 

Nói cách khác, base_class mang đến cho bạn phía trên cùng của cây thừa kế nhưng giới hạn trong bối cảnh ứng dụng của bạn. Tuy nhiên, nếu bạn có một mô hình phân lớp một cái gì đó được định nghĩa trong một viên ngọc, thì base_class sẽ trả về lớp của đá quý chứ không phải của bạn.

1

Thừa kế là mối quan hệ giữa hai lớp. Thừa kế tạo ra một mối quan hệ con cái giữa các lớp học cha mẹ. Nó là một cơ chế cho mã tái sử dụng và cho phép các phần mở rộng độc lập của phần mềm gốc thông qua các lớp và giao diện công khai. Lợi ích của việc thừa kế là các lớp có mức độ thấp hơn, nhưng có thể thêm cụ thể tính năng của riêng mình.

Trong Ruby, một lớp chỉ có thể kế thừa từ một lớp khác. (ví dụ: một lớp có thể kế thừa từ một lớp thừa kế từ một lớp khác kế thừa từ một lớp khác, nhưng một lớp duy nhất không thể kế thừa từ nhiều lớp cùng một lúc). Lớp BasicObject là lớp cha của tất cả các lớp trong Ruby. Do đó, các phương thức của nó có sẵn cho tất cả các đối tượng trừ khi được ghi đè rõ ràng.

Ruby vượt qua kế thừa lớp đơn cùng một lúc bằng cách sử dụng mixin.

Tôi sẽ cố gắng giải thích bằng ví dụ.

module Mux 
def sam 
    p "I am an module" 
end 
end 
class A 
    include Mux 
end 
class B < A 
end 
class C < B 
end 
class D < A 
end 

Bạn có thể theo dõi bằng cách sử dụng class_name.superclass.name và thực hiện quy trình này trừ khi bạn tìm thấy BasicOject trong cấu trúc phân cấp này. BasicObject là siêu lớp o mỗi lớp. cho phép xem giả sử chúng ta muốn xem cây phân cấp lớp C.

C.superclass 
    => B 
B.superclass 
    => A 
A.superclass 
    => Object 
Object.superclass 
    => BasicObject 

Bạn có thể thấy toàn bộ hệ thống phân cấp của lớp C. Chỉ vào lưu ý bằng cách tiếp cận này bạn sẽ không tìm thấy các mô-đun được bao gồm hoặc được thêm vào trong lớp cha.

Có một cách tiếp cận khác để tìm phân cấp hoàn chỉnh bao gồm các mô-đun. Theo tài liệu của Ruby ancestors. Trả về một danh sách các mô-đun bao gồm/được thêm vào trong mod (bao gồm cả bản thân mod).

C.ancestors 
=> [C, B, A, Mux, Object, Kernel, BasicObject] 

Ở đây, Mux và hạt nhân là mô-đun.

http://rubylearning.com/satishtalim/ruby_inheritance.html https://en.wikipedia.org/wiki/Inheritance_(object-oriented_programming)

Các vấn đề liên quan