Sự khác biệt là giữa gì một cái gì đó là, và như thế nào một cái gì đó cư xử.
Rất nhiều ngôn ngữ cố gắng gắn kết hai thứ lại với nhau, nhưng chúng là những thứ khá khác biệt.
Nếu như thế nào là gì và thế nào là ...
Nếu mọi thứ kế thừa từ object
đó thì một số lợi ích xảy ra như: bất kỳ biến đối tượng nào cũng có thể giữ bất kỳ giá trị nào. Nhưng đó cũng là sự cọ xát, mọi thứ phải hành xử ( như thế nào ) như một object
, và trông giống như ( những gì ) một object
.
Nhưng:
- Điều gì xảy ra nếu đối tượng của bạn không có một định nghĩa có ý nghĩa về sự bình đẳng?
- Điều gì nếu nó không có một hàm băm có ý nghĩa?
- Điều gì nếu đối tượng của bạn không thể được nhân bản, nhưng đối tượng có thể được?
Hoặc là object
loại trở nên về cơ bản vô dụng - do đối tượng cung cấp không tương đồng trên tất cả các trường hợp có thể. Hoặc sẽ tồn tại các đối tượng có một định nghĩa gãy / sừng / vô lý của một số tài sản phổ quát được cho là được tìm thấy trên object
đó chứng minh hành vi gần như phổ quát ngoại trừ một số vấn đề.
Nếu những gì không bị ràng buộc với Làm thế nào
Hoặc bạn có thể giữ gì và như thế nào riêng biệt. Sau đó, một số loại khác nhau (không có gì chung ở tất cả những gì ) tất cả có thể hành xử theo cùng một cách như được nhìn thấy từ cộng tác viên như thế nào . Theo nghĩa này, ý tưởng về một Iterator
không phải là một cái gì đó cụ thể , mà là làm thế nào . Cụ thể Làm thế nào để bạn tương tác với một thứ khi bạn chưa biết Bạn đang tương tác với cái gì.
Java (và tương tự) cho phép tiếp cận điều này bằng cách sử dụng các giao diện. Một giao diện trong vấn đề này mô tả các phương tiện giao tiếp, và mặc nhiên là một giao thức giao tiếp và hành động được tuân theo. Bất kỳ cái gì tuyên bố chính nó là của một How nhất định , nói rằng nó hỗ trợ giao tiếp và hành động có liên quan được phác thảo bởi giao thức. Điều này cho phép bất kỳ cộng tác viên nào dựa vào Cách thức và không bị sa lầy bằng cách chỉ định chính xác những gì có thể được sử dụng.
C ++ (và tương tự) cho phép tiếp cận điều này bằng cách gõ vịt. Một mẫu không quan tâm nếu loại cộng tác tuyên bố rằng nó tuân theo một hành vi, chỉ là trong một bối cảnh biên dịch nhất định, đối tượng có thể được tương tác với một cách cụ thể. Điều này cho phép các con trỏ C ++ và các toán tử cụ thể vượt quá các toán tử cụ thể được sử dụng bởi cùng một mã. Bởi vì họ đáp ứng danh sách kiểm tra để được coi là tương đương.
- hỗ trợ * a, a->, ++ a và ++ -> iterator đầu vào / chuyển tiếp
- hỗ trợ * a, a->, ++ a, a ++, --a và a-- -> iterator hai chiều
Kiểu cơ bản thậm chí không phải lặp lại một container, nó có thể là bất kỳ cái gì . Ngoài ra, nó cho phép một số cộng tác viên thậm chí còn chung chung hơn, hãy tưởng tượng một hàm chỉ cần a++
, một trình lặp có thể đáp ứng điều đó, do đó, một con trỏ cũng vậy, một số nguyên cũng có thể thực hiện bất kỳ đối tượng nào operator++
.
Thông số kỹ thuật dưới và trên
Vấn đề với cả hai cách tiếp cận là dưới và trên đặc điểm kỹ thuật.
Sử dụng một giao diện yêu cầu đối tượng khai báo nó hỗ trợ một hành vi nhất định, điều đó cũng có nghĩa là người tạo phải thấm nhuần điều đó ngay từ đầu. Điều này gây ra một số Điều không thể cắt giảm, vì họ đã không tuyên bố điều đó. Nó cũng có nghĩa là bao giờ Cái gì có tổ tiên chung, giao diện đại diện cho How . Điều này không quay trở lại vấn đề ban đầu của object
. Điều này khiến các cộng tác viên chỉ định quá mức các yêu cầu của họ, đồng thời khiến một số đối tượng không thể sử dụng được do thiếu khai báo hoặc bị ẩn giấu vì hành vi dự kiến được xác định kém.
Sử dụng một mẫu yêu cầu cộng tác viên làm việc với một cái gì đó hoàn toàn không biết , và thông qua các tương tác của nó, nó xác định một Cách . Ở một mức độ nào đó, điều này làm cho các cộng tác viên viết lách trở nên khó khăn hơn, vì nó phải phân tích Điều gì cho các nguyên tắc giao tiếp của nó (chức năng / trường / v.v.) trong khi tránh các lỗi biên dịch, hoặc ít nhất chỉ ra làm thế nào một cái gì đó không phù hợp với yêu cầu của nó đối với Cách làm . Điều này cho phép cộng tác viên yêu cầu mức tối thiểu tuyệt đối từ bất kỳ Điều gì đã cho, cho phép phạm vi rộng nhất của những gì sẽ được sử dụng. Thật không may, điều này có nhược điểm là cho phép sử dụng vô nghĩa các đối tượng mà kỹ thuật cung cấp các nguyên thủy giao tiếp cho mộtLàm thế nào , nhưng không tuân theo giao thức ngụ ý cho phép tất cả các loại điều xấu xảy ra.
Lặp đi lặp lại
Trong trường hợp này một Iterator
là thế nào nó là viết tắt cho một mô tả về tương tác. Bất cứ điều gì phù hợp với mô tả đó là theo định nghĩa một Iterator
. Biết cách cho phép chúng tôi viết các thuật toán chung và có một danh sách ngắn về ' Làm thế nào được cung cấp một cái gì đó cụ thể ' cần được cung cấp để làm cho thuật toán hoạt động. Danh sách đó là các hàm / thuộc tính / vv, việc thực hiện chúng có tính đến cụ thể Điều gì đang được xử lý bằng thuật toán.