2010-02-08 24 views
48

Tôi vừa đọc qua cuốn sách và có thuật ngữ "HAS-A" và "IS-A" trong đó. Bất cứ ai biết những gì họ có ý nghĩa cụ thể? Đã cố gắng tìm kiếm trong cuốn sách, nhưng cuốn sách dài 600 trang.HAS-A, thuật ngữ IS-A trong ngôn ngữ hướng đối tượng

+0

Bạn đang đọc sách gì? –

+0

"Is-a" nó tái sử dụng mã bởi thừa kế, "có-a" - theo phái đoàn. –

Trả lời

14

Has-a có nghĩa là Lớp được đề cập 'có' trường loại.

Is-a có nghĩa là Lớp mở rộng từ siêu lớp hoặc triển khai giao diện. Nhà điều hành instanceof sẽ trả lại true nếu được kiểm tra đối với một lớp trong trường hợp này.

49

A Car có một Wheel.

A Sparrow là-a Bird.

Về mặt học thuật, các thuật ngữ được sử dụng để quyết định giữa bố cục và thừa kế.

+0

Họ có phải có mối quan hệ thực sự không? Tôi có nghĩa là tôi có một lớp Doors mở rộng lớp Home, nhưng một cánh cửa không phải là một ngôi nhà thực tế, nhưng nó mở rộng lớp Home theo lập trình. –

+3

@ BurakKarakuş: Vậy thì có thể sai. Isa/Hasa là một câu hỏi bạn tự hỏi mình để quyết định liệu thừa kế là câu trả lời đúng hay không. Có lẽ cánh cửa của bạn nên 'có một' nhà, không phải là 'nhà'. –

6

Đây không phải là java cụ thể, đó là OO cụ thể.

IS-A có nghĩa là bạn có thể có một lớp học "là" một cái gì đó. Giống như một sinh viên "IS-A" người. Điều này được sử dụng để mô tả một đối tượng là một lớp con của một đối tượng khác.

Đôi khi không có mối quan hệ IS-A giữa hai lớp, nhưng "HAS-A" là phù hợp hơn. Ví dụ, một chiếc ghế "HAS-A" chân. hoặc một vài. điều này được gọi là tập hợp, trái với thừa kế.

Tôi không đi sâu vào chi tiết khi sử dụng, bởi vì nó phụ thuộc vào cách các lớp đang được sử dụng và thậm chí nếu được biết có quá nhiều điều cần xem xét, một câu hỏi mới cho một trường hợp cụ thể sẽ phù hợp hơn .

+0

Và ngay cả những thứ như 'Sinh viên IS-A' có xu hướng rất có vấn đề, ví dụ trong trường hợp một Sinh viên sau này trở thành Giáo sư. Tôi thường không thích tấn công các vấn đề OO dựa trên cấu trúc của mọi thứ, mà là về hành vi của chúng và cách chúng biến đổi dữ liệu. Tôi gần như không bao giờ sử dụng thừa kế cho loại công việc kết cấu đó, chỉ cho các giá trị (một Tên là một kiểu Chuỗi), hoặc để sử dụng lại mã mẫu. – kyoryu

4

Is a = Loại đặc biệt ví dụ: Xe là loại xe đặc biệt.

Có a = Vật lý có thứ gì đó, ví dụ: Xe có động cơ.

119

Đây là lập trình hướng đối tượng và thuật ngữ UML, không phải dành riêng cho Java. Thực tế, có ba trường hợp, bạn cần phải nhận thức:

  1. Một Nhà là một tòa (thừa kế);
  2. A House Phòng (thành phần);
  3. A House có số người dùng (tổng hợp).

Sự khác biệt giữa (2) và (3) là tinh tế nhưng rất quan trọng để phân biệt. Họ cùng nhau là các hình thức của hiệp hội . Có gì khác biệt? Thành phần ngụ ý rằng đối tượng con không thể sống trong bối cảnh của cha mẹ (phá hủy nhà và phòng biến mất) trong khi tập hợp ngụ ý rằng đứa trẻ có thể tồn tại một mình (phá hủy ngôi nhà và người cư ngụ đi nơi khác).

+9

+1 cho sự khác biệt giữa bố cục và tổng hợp. Một cách khác để nói là tập hợp là một thành phần dạng lỏng lẻo. – fastcodejava

+0

Tôi nghĩ rằng có mối quan hệ 'thiếu' - 'cộng tác với'. Điều đó dường như xếp hàng tương đối tốt với định nghĩa thứ 3 của bạn.Sự khác biệt chính mà tôi thấy giữa các định nghĩa 2 và 3 là một trong những quyền sở hữu. – kyoryu

+2

4. Nhà ** sử dụng nhà cung cấp dịch vụ internet (liên kết) **. –

2

như các điểm của cletus, is-a khác. nhưng hãy cẩn thận với has-a. điều này có nghĩa là thành phần (khả năng đáp ứng trọn đời), tập hợp (một phần của thứ gì đó), hoặc đơn giản là sử dụng-a (có tham chiếu đến, biết cách xây dựng một hoặc tìm một). cái sau chỉ là một liên kết.

+1

Đối với các thực thể có thể thay đổi, 'uses-a' có lẽ là mối quan hệ quan trọng nhất, và mối quan hệ ít được suy nghĩ nhất. – kyoryu

3

IS-A, HAS-A vv không thực sự rất OO. Thay vào đó, Liskov substitution principle là OO.

Bác Bob đã làm rõ được lịch sử của ISA tại http://www.hanselminutes.com/default.aspx?showID=163

Robert C. Martin: Từ "ISA" len lỏi vào từ vựng của chúng tôi và bằng cách đó là một từ ISA, nó len lỏi vào từ vựng của chúng tôi thông qua một lộ trình mạch và trở nên rất quan trọng trong các vòng tròn hướng đối tượng, nhưng nó không bắt đầu theo cách đó. Nó lọt vào thập niên 80 qua đám đông AI, người đã tạo ra những lưới kiến ​​thức tuyệt vời này, bạn có thể nhớ điều này, tất cả sự cường điệu về Trí tuệ nhân tạo vào cuối những năm 80, đầu thập niên 90, và sau đó tạo ra những cấu trúc này và mối quan hệ giữa các thực thể và mạng kiến ​​thức với những thứ như, giống như, có mùi, giống như một ISA, tất cả những mối quan hệ này, giống như a, có và khi AI bị mất tiền, và tất cả những ổ đĩa tài trợ đó, chúng nhìn về phía trước và nói, "Ồ, có những thứ khác, thật tuyệt vời. Nhìn kìa, có những mối quan hệ như đã và đang diễn ra, nó thực sự tương tự, chúng ta nên chuyển vào. " Và họ đã làm và từ vựng đã chuyển đổi. Điều đó thật thú vị, nó cũng hơi đáng tiếc vì thừa kế không phải là ISA. Thừa kế, nếu bạn nhìn vào nó với một con mắt rất đăm đăm, thừa kế là khai báo các phương thức và các biến trong một subscope và nó không liên quan gì đến ISA, và khái niệm ISA có thể rất khó hiểu. Ví dụ đơn giản, một số nguyên là một số thực và một số thực là một số phức. Bạn có thể vẽ nó trong UML của bạn, nó rất đơn giản với tất cả các thừa kế ở đó và vân vân, nhưng hãy nghĩ đến việc cố gắng biên dịch nó. Một số nguyên mà chúng ta hi vọng sẽ là 16 hoặc có thể 64 bit nhưng nếu nó xuất phát từ số thực, một số thực có hai số nguyên trong đó, một số và một đặc tính, số mũ và chúng được sử dụng, chúng ngụ ý các điểm nhị phân bên trong chúng để làm cho các số dấu phẩy động này. Số dấu phẩy động, số thực, có nguồn gốc từ phức tạp nhưng phức tạp có hai số thực trong đó, phần ảo và phần thực. Nếu bạn nghĩ về việc viết nó trong C++ hoặc trong Java, bạn sẽ viết một cấu trúc mà không thể được biên dịch vì nó có ý nghĩ vô hạn. Làm cho cảm giác hoàn hảo bằng tiếng Anh không có ý nghĩa gì cả trong phần mềm.

1

"IS A": Thiết lập mối quan hệ giữa các đối tượng liên quan. Bạn có thể sử dụng số thừa kế để thiết lập mối quan hệ.

"ĐÃ CÓ": Xác định khả năng cho các đối tượng có thể không liên quan. Bạn có thể sử dụng giao diện để xác định khả năng.

Ví dụ:

Chó LÀ MỘT Animal. Nó HAS A khả năng để tìm hiểu.

Man IS Not A Animal. Ông HAS A khả năng Tìm hiểu, Suy nghĩ, Trèo lên và Áp dụng.

0

Nếu bạn phát triển Bộ sưu tập có tên là "Trường học". Bạn sẽ có "giáo viên" và "sinh viên" trong trường. Bạn phát triển một lớp "người" và cả "học sinh" và "giáo viên" sẽ kế thừa từ lớp "Người" vì cả hai đều - "là một" người. Cả hai sinh viên và giáo viên đều có một sinh nhật. Bạn sẽ tạo một "Date Class" vì cả giáo viên và sinh viên "có" hoặc "có một" sinh nhật bên trong "Class Person".Đây là "containership" Tóm tắt "là một người" sử dụng thừa kế "có một" sử dụng tàu container

1

Những cái tên khá hàm ý tất cả.

Lớp IS-A có thể được coi là tham chiếu chuyên biệt cho một phiên bản của một lớp khác kế thừa tất cả các thuộc tính của nó.

Nếu một lớp được gọi là Xe hiện có. Sau đó, bất kỳ loại của chiếc xe có thể kế thừa các thuộc tính của siêu hạng này. Ví dụ: Xe cảnh sát sẽ kế thừa tất cả các thuộc tính của Xe vì nó là một chuyên môn hóa sau này.

enter image description here

Mặt khác, một HAS-A lớp có một tham chiếu đến lớp khác hoặc một thể hiện của một lớp khác. Nói cách khác, nó chia sẻ một liên kết với một lớp khác. Có hai loại lớp HAS-A, tập hợp có nghĩa là lớp học có thể tồn tại độc lập và thành phần, có nghĩa là lớp chỉ có thể tồn tại dọc theo lớp mà nó chia sẻ liên kết.

Điều quan trọng là phải biết khi phân loại đối tượng thành một lớp thành phần hoặc đơn giản là thuộc tính của một lớp khác.

Lấy xe lớp một lần nữa, một driver lớp sẽ được coi là một tập hợp vì driver lớp có thể tồn tại như một thực thể độc lập ngay cả khi lớp xe không còn tồn tại.

Trong khi một lớp không thể tồn tại nếu một lớp xe là không tồn tại, bởi vì không thể tồn tại bên ngoài phạm vi của xe.

enter image description here

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