2010-06-23 27 views
10

Tương đương Smalltalk của các trường và phương thức tĩnh của Java là gì? IOW, Smalltalkers làm gì khi họ cần dữ liệu cấp lớp và/hoặc phương pháp?Tương đương Smalltalk của tĩnh Java là gì?

+0

Không xứng đáng với câu trả lời "chính thức", nhưng tôi tình cờ gặp phải trang này có thể giúp bạn: http://per.bothner.com/papers/smalltalk.html. –

+0

Tôi muốn đề xuất chia nhỏ câu hỏi thứ hai của bạn thành câu hỏi _separate_. –

+0

@Frank: Tốt. Như bạn nói. – Jim

Trả lời

10

Chúng tôi sử dụng các biến phương thức/biến đối tượng lớp. Một lớp là một đối tượng, sau khi tất cả, vì vậy có thể có phương pháp.

Ví dụ, lớp Rectangle có một phương pháp #origin: góc: vì vậy bạn có thể viết

Rectangle origin: [email protected] corner: [email protected] 

để tạo ra một hình chữ nhật. Đây chỉ là thông điệp #origin: corner: được gửi đến đối tượng có tên Rectangle (một lớp là một đối tượng!) Với hai tham số là các tham số.

Biến mẫu bên cạnh hoạt động giống nhau. Một lớp, là một đối tượng, có thể có các biến mẫu. Từ thư viện SUnit:

TestCase class 
    instanceVariableNames: 'history' 

và sau đó lớp TestCase hiển thị theo cách thông thường, với getter/setter (#history và #history :).

EDIT: @ Tôi đã sử dụng đã gây ra một chút công bằng thảo luận. Đó là những gì được gọi là binary message, cho phép một để xác định bộ chọn mà chỉ là những gì các ngôn ngữ khác sẽ gọi các nhà khai thác infix. Ví dụ: 3 + 4 hoặc [email protected]. Trong trường hợp @, lớp Number xác định phương thức được gọi là @ tham số y, được định nghĩa là ^Point x: self y: y - "trả về một điểm có toạ độ x là giá trị của riêng tôi và toạ độ y là tham số".

Điểm là một cặp đặt hàng, nhưng tất nhiên không có gì ngăn một người xác định các phiên bản cao hơn. Point có thể xác định phương thức được gọi là @ trông giống như thế này, ví dụ: ^Triple x: self x y: self y z: z - "trả về một điểm trong R^3 có toạ độ x, y là của riêng tôi và toạ độ z của nó là tham số đã cho".

+0

Làm bất kỳ ngôn ngữ nào khác ngoài sử dụng Smalltalk @ để phân định các tọa độ khác nhau của một điểm? Tôi không tin rằng tôi đã nhìn thấy cú pháp cụ thể đó trước đây. – JAB

+0

Điều đó có nghĩa là '@' chỉ ra một bộ tuple không? – Jim

+0

@ là một "thông báo nhị phân" - một thông báo nhận một thông số duy nhất, nhưng không cần dấu sau thông thường:. Số định nghĩa một phương thức được gọi là @ trả về một điểm:^Điểm x: tự y: y (trong đó y là thông số duy nhất, rõ ràng). –

1

Trong hầu hết các loại Smalltalk, bạn có các biến lớp. Các biến lớp thông thường được sử dụng cho ví dụ: singletons. Có sự khác biệt trong các loại biến mà bạn có thể sử dụng giữa các hương vị của Smalltalk, vì vậy hãy đọc tài liệu về điểm này để thực hiện cụ thể của bạn.

4

Cần thay đổi tâm trí quan trọng nhất nếu bạn đến Smalltalk từ Java hoặc như vậy, là các lớp đó là các đối tượng.

Một ngôn ngữ tĩnh trong ngôn ngữ Java có thể có nhiều ngữ nghĩa khác nhau. Thông thường điều này phải làm với khả năng hiển thị. Bạn cần một đối tượng độc lập với bất kỳ trường hợp nào của một lớp, nhưng bạn muốn hạn chế khả năng hiển thị của đối tượng này trong lớp, đó là: chỉ hiển thị từ các cá thể của lớp hoặc chính lớp đó (trong Smalltalk, vì trong Java các lớp không phải là các đối tượng hạng nhất).

Trong Smalltalk bạn thường có nhiều lựa chọn cho việc này:

  1. biến dụ Lớp
  2. biến lớp hoặc các biến bơi (tùy thuộc vào phương ngữ Smalltalk của bạn)

Một biến lớp dụ thực sự được giống như một biến cá thể của bất kỳ lớp nào: lớp này có thuộc tính này và có thể truy cập được đối với bất kỳ cá thể nào của lớp bằng cách cung cấp phương thức getter trên lớp (không phải trong trường hợp, chúng tôi gọi đây là phương thức lớp) . Điều này rất hữu ích nếu bạn có các giá trị mặc định và như vậy. Ví dụ:

Định nghĩa một lớp Car, với ví dụ biến colour, PLUS một trường lớp biến defaultColour (trong đó tất nhiên sẽ có giá trị "BLACK" ;-))

Smalltalk defineClass: #Car 
    superclass: #{Core.Object} 
    indexedType: #none 
    private: false 
    instanceVariableNames: 'colour ' 
    classInstanceVariableNames: 'defaultColour' 
    imports: '' 
    category: '' 

Đây là một định nghĩa lớp (thực sự là một tin nhắn đến đối tượng Smalltalk) trong VisualWorks Smalltalk. Nếu bạn tạo một lớp con của Car, nó kế thừa biến phiên bản lớp defaultColour, như một đối tượng bình thường cũng sẽ làm. Nếu biến đối tượng lớp defaultColour có giá trị, lớp con cũng thừa hưởng giá trị này!

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