Chương V : Lớp và Module
2. Tra cứu phương thức của lớp
Thuật toán phân giả tên cho phương thức lớp cũng giống như cho các phương thức, nhưng có một sự khác biệt. Ta bắt đầu bằng một trường hợp đơn giản. Một lớp C không định nghĩa phương thức nào:
class C end
Nhớ rằng sau khi ta định nghĩa một lớp như thế, biến hằng C ám chỉ một đối tượng là thể hiện của Class. Bất cứ phương thức cho lớp ta định nghĩa đều là các phương thức singleton của đối tượng C.
Khi ta đã định nghĩa một lớp C, ta viết một biểu thức lời gọi phương thức sử dụng phương thức new của lớp:
c = C.new
Để phân giải phương thức new, Ruby đầu tiên tìm các phương thức trong lớp đặc trưng của đối tượng C. Lớp của ta khơng có một phương thức lớp nào, nên sẽ khơng có gì được tìm thấy. Sau khi tìm kiếm trên lớp đặc trưng, thuật tốn phân giải tên tìm kiếm trong đối tượng lớp của C. Lớp của C là Class, vì thế Ruby tiếp tục tìm kiếm trong các phương thức của Class, và nó tìm thấy một phương thức tên là new ở đây.
Thuật toán phân giải tên phương thức cho phương thức lớp C.new kết thúc việc xác định phương thức tham chiếu Class.new. Sự khác nhau giữa phương thức tham chiếu và phương thức lớp trong Ruby là giả tạo. Một lời gọi phương thức, dù là phương thức tham chiếu hay phương thức lớp, đều có một đối tượng nhận và một tên phương thức. Thuật tốn phân giải tên tìm định nghĩa phương thức chính xác cho đối tượng đó. Đối tượng C của ta là một thể hiện của lớp Class, vì thế ta có thể gọi các phương thức tham chiếu của Class thông qua C. Hơn nữa, Class thừa kết các phương thức tham chiếu của Module, Object, và Kernel, vi thế những phương thức được thừa kế này có thể được sử dụng như là những phương thức của C. Lí do duy nhất ta gọi chúng là các “phương thức lớp” vì đối tược C của ta là một lớp.
Sự khác biệt được nhắc ở phần đầu ở đây có liên quan đến việc các phương thức lớp được thừa kết thì giống như các phương thức tham chiếu. Ta định nghĩa một phương thức lớp Integer.parse như sau:
text.to_i end
Bởi vì Fixnum là lớp lớp con của Integer, ta có thể gọi phương thức này với biểu thức như sau:
n = Fixnum.parse("1")
Từ sự mơ tả thuật tốn phân giải tên phương thức ở trên, ta biết rằng Ruby sẽ tìm trong các lớp đặc trưng của Fixnum các phương thức singleton. Tiếp theo, nó sẽ tìm các phương thức tham chiếu của Class, Module, Object, và Kernel. Vậy nó sẽ tìm thấy phương thức parse ở đâu? Một phương thức lớp của Integer chỉ là một
phương thức singleton của đối tượng Integer, có nghĩa là nó được định nghĩa bởi lớp đặc trưng của Integer. Vậy làm thế nào để lớp đặc trưng của Integer tham gia vào quá trình phân giải tên?
Các đối tượng lớp là đặc biệt: chúng có lớp các cha. Các lớp đặc trưng của đối tượng cũng đặc biệt: chúng cũng có lớp cha. Lớp đặc trưng của một đối tượng bình thường sẽ đứng một mình và khơng có lớp cha. Hãy sử dụng tên Fixnum’ và
Integer’ để ám chỉ các lớp đặc trưng của Fixnum và Integer. Lớp cha của Fixnum’ là Integer’.
Với sự khác biệt này, ta có thể hồn tồn giải thích thuật tốn phân giải tên phương thức và nói rằng khi Ruby tìm kiếm phương thức singleton trong lớp đặc trưng của một đối tượng, nó cũng đồng thời tìm kiếm các lớp cha (và mọi lớp tổ tiên) của lớp đặc trưng. Vì thế khi tìm kiếm một phương thức lớp của Fixnum, Ruby đầu tiên kiểm tra các phương thức singleton của Fixnum, Integer, Numeric và Object, và sau đó kiểm tra các phương thức tham chiếu của Class, Module,
Object, và Kernel.