Tôi đang học một khái niệm cơ bản về Smalltalk. Có một từ khóa super
được dùng để gọi một phương thức từ lớp cha bên trong một phương pháp lớp con:Từ khoá "siêu" trong phương thức lớp học
Object subclass: # A
test
^1
A subclass: # B
test
^2
callSuper
^super test
Vì vậy B new callSuper
đánh giá để 1
.
OK. Điều đó rõ ràng.
Vì vậy, bây giờ, tôi đang xác định một loạt các phương pháp lớp cho B
lớp:
createNew1
^super new
createNew2
^self new
create
^self
createSuper
^super
Và họ đánh giá tương ứng để a B
, a B
, B
và một lỗi (trong đó cho thấy tôi rằng super
không phải là một diễn viên để phân lớp nhưng loại của một điều phối thư).
Tại sao tôi nhận được các trường hợp B
lớp mặc dù từ khóa super
? Và sự khác nhau giữa các đối tượng a B
và B
là gì? Tôi đã bắt đầu nghĩ rằng đối tượng B
là một trường hợp đặc biệt, đơn lẻ (giống như các thuộc tính static
được triển khai bằng các ngôn ngữ khác) của lớp B
, nhưng vẫn - tôi đã kiểm tra và lớp là B
và lớp con là A
.
Ngữ nghĩa của super
từ khóa trong phương thức lớp học là gì? Làm thế nào nó khác với ngữ nghĩa bên trong các phương thức đối tượng? Điều gì thực sự là đối tượng mà có thể thu được bằng cách gọi self
bên trong phương thức lớp học?
Nếu bạn đã quen thuộc với C#, mọi thứ có ý nghĩa nếu bạn xem xét mọi phương thức Smalltalk (cá thể hoặc lớp) như được khai báo là ảo. –
"Biểu thức B runTest mới được đánh giá là 'A'" Không! Bạn có thực sự đánh giá mã này hay chỉ thực hiện một thử nghiệm suy nghĩ ?! Một trong những lợi ích tuyệt vời của Smalltalk là việc thực hiện thí nghiệm dễ dàng như thế nào. Nếu bạn đánh giá "B runTest mới", bạn sẽ thấy rằng nó trả về 'B' –
@SeanDeNigris Có thể nó không rõ ràng do tiếng anh nghèo của tôi, nhưng tôi muốn viết, rằng tôi đã nghĩ rằng nó được đánh giá 'A' trong khi ở thực tế nó được đánh giá là 'B' (được viết ở đoạn kế tiếp). Tôi sẽ cố gắng chỉnh sửa và làm rõ. –