2010-01-25 26 views
5

Tôi mới sử dụng OOP, nhưng có nền "thủ tục".Supertalk superclass vs metaclass?

Tôi hiện đang cố gắng để có được đầu của tôi xung quanh OOP qua GNU Smalltalk và Lovejoy "Smalltalk: Getting The Message".

Tôi bị nhầm lẫn với heck lớp metaclass và Metaclass là, so với siêu lớp. Tôi có thể thấy dòng thừa kế của lớp cha -> lớp -> phân lớp; nhưng tôi không thấy làm thế nào/nơi metaclass phù hợp. TIA ...

Trả lời

5

Có mô tả tuyệt vời trong sách trực tuyến miễn phí Pharo by Example, Chương 13 (Lớp học và siêu lớp). Những điều được giải thích trong chương này là phổ biến cho tất cả các triển khai Smalltalk.

+0

Cảm ơn bạn đã liên kết! Có vẻ là những gì tôi đang tìm kiếm. – duke

+1

Bạn nên bao gồm ý chính của cuốn sách trả lời câu hỏi này thay vì chỉ đề cập đến một liên kết. Khi liên kết đó bị hỏng, câu trả lời này sẽ không còn hữu dụng nữa –

4

Thực tế có hai cấp độ thừa kế: kế thừa thể hiện và thừa kế lớp.

Smalltalk có một lược đồ đặc biệt giúp bạn có thể vượt qua khoảng các lớp làm đối tượng. Điều đó có nghĩa là các lớp học cũng là đối tượng theo quyền riêng của họ. Metaclass là "đơn giản" lớp của đối tượng lớp.

Nó không can thiệp vào kế thừa thể hiện thông thường, do đó, nó không phù hợp với bất kỳ vị trí nào trong sơ đồ superclass -> class -> subclass bạn đã sử dụng.

+0

@ zneak -> "Metaclass là" đơn giản "là lớp của đối tượng lớp." Tôi nghĩ rằng siêu lớp là "lớp của đối tượng lớp". Đó là câu hỏi của tôi - sự khác biệt giữa siêu lớp và metaclass là gì? – duke

+0

"Thực tế có hai cấp độ thừa kế: kế thừa thể hiện và thừa kế lớp." Từ công thức này, tôi đoán bạn đang bối rối thừa kế và instanciation ... –

+0

Điều này thực sự là những gì tôi có ý nghĩa. Các lớp con có thể ghi đè lên những gì chúng ta gọi là các phương thức tĩnh bằng các ngôn ngữ khác. – zneak

3

Có hai quan hệ khác nhau trong OO dựa trên lớp: instantiationthừa kế.

õ là mối quan hệ giữa một đối tượng và các lớp học, từ khóa new, vv Thông thường nó được thực hiện bởi một con trỏ trong các đại diện cấp thấp của bất kỳ đối tượng. Trong Smalltalk, anObject class duyệt qua con trỏ này; nó cũng xảy ra rằng các lớp cũng là các đối tượng, và các lớp của các lớp được gọi là metaclasses, nhưng đây là cùng quan hệ với các cá thể.

Thừa kế là mối quan hệ giữa các lớp. Bạn có thể đi từ một lớp học đến lớp học của mình bằng cách thực hiện aClass superclass và tiếp tục làm như vậy cho đến khi bạn đến lớp học Object. Trong Smalltalk, con trỏ superclass chỉ là một biến cá thể được định nghĩa trên tất cả các lớp và thông báo superclass là một trình truy cập bình thường.

0

Theo khái niệm, superclass là cấp độ gốc của lớp của đối tượng. tức là Cấp độ một lớp cao hơn trong phân cấp Lớp so với Lớp của đối tượng hiện tại.

Là một phương thức được đặt tên, nó trả về tên của siêu lớp ngay lập tức của người nhận. ví dụ: nó definedin Squeak Smalltalk (và cũng có thể trong các dẫn xuất của nó, Pharo và CUIS) như superclass "Answer the receiver's superclass, a Class." ^superclass

Trong Dolphin Smalltalk, nó được định nghĩa như 'cha "Trả lời một mà là ngay lập tức lớp cha của người nhận (hoặc nếu không có)."

^superclass' 

Nhưng - mọi lớp trong phân cấp Lớp thực sự là một thể hiện của lớp cha. Vì vậy, lớp mà một lớp nhất định là một thể hiện của, là lớp học của MetaClass.

Vì vậy, ví dụ: aSortedCollection là một đối tượng - một thể hiện của Class SortedCollection.

SortedCollection là Class 'ClassedCollection' có tên lớp trong phân cấp Lớp có thể duyệt. Đồng thời, nó cũng là cũng là một thể hiện của một Metaclass - một Lớp ẩn danh có một cá thể đối tượng đơn lẻ, là một lớp có tên. Lớp được đặt tên có thể nhìn thấy trong hệ thống phân cấp lớp, nhưng Metaclass (ẩn danh) ít được nhìn thấy nhiều hơn. Nó có đó để Smalltalk

Smalltalk duy trì cấu trúc phân cấp Metaclass, tức là phân cấp của các Lớp học của Lớp học. Nó ít hiển thị hơn, vì nó được giữ như là các đối tượng hệ thống ẩn danh, nhưng bạn có thể tìm thấy cấp cao nhất của hệ thống phân cấp Metaclass trong trình duyệt Lớp. Cả hai loại Class và Class Metaclass đều được tìm thấy dưới dạng các phân lớp phụ của Class Behaviour, chính nó là một phân lớp con của Class Object.

Một lý do mà mọi người nói rằng "Trong Smalltalk, mọi thứ là một đối tượng" là vì Lớp Object là gốc của tất cả các Lớp và đối tượng khác - nó ở trên cùng của phân cấp đối tượng, chứa phân cấp Lớp và phân cấp Metaclass.

(Nó thường ở giai đoạn này mà bộ não của tôi bắt đầu chảy máu ra khỏi tai của tôi, nhưng thứ sau 3 điểm giúp đẩy nó tất cả lại vào hộp sọ của tôi)

Nếu bạn gửi tin nhắn anInstanceOfAClass class - bạn sẽ nhận được
Lớp đối tượng anInstanceOfAClass đã trả lại.

Nếu bạn gửi tin nhắn anInstanceOfAClass class superclass - bạn sẽ nhận được
Lớp cha của Lớp đối tượng anInstanceOfAClass đã trả lại.

Nếu bạn gửi thư anInstanceOfAClass class class - bạn sẽ nhận được singleton ẩn danh Metaclass của Lớp đối tượng anInstanceOfAClass đã trả lại.

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