Một lớp bao bọc là gì?


Câu trả lời:


171

Nói chung, một lớp bao bọc là bất kỳ lớp nào "bao bọc" hoặc "đóng gói" chức năng của một lớp hoặc thành phần khác. Chúng rất hữu ích bằng cách cung cấp một mức độ trừu tượng từ việc thực hiện lớp hoặc thành phần cơ bản; ví dụ, các lớp trình bao bọc các thành phần COM có thể quản lý quá trình gọi thành phần COM mà không làm phiền mã gọi với nó. Họ cũng có thể đơn giản hóa việc sử dụng đối tượng cơ bản bằng cách giảm các điểm giao diện số liên quan; thường xuyên, điều này làm cho việc sử dụng an toàn hơn các thành phần cơ bản.


15
Một lớp bao bọc (như bộ điều hợp) được sử dụng khi trình bao bọc phải tôn trọng một giao diện cụ thể và phải hỗ trợ một hành vi đa hình. Mặt khác, một mặt tiền được sử dụng khi người ta muốn giao diện dễ dàng hơn hoặc đơn giản hơn để làm việc.
Yadu

3
Trong bài này, nó được đề xuất rằng một wrapper có thể hữu ích cho việc tạo một proxy đúng định nghĩa cho một lớp cuối-bound: Tôi có thể sử dụng vào cuối ràng buộc ... . Đây có phải là một sử dụng bổ sung hợp lệ cho các hàm bao ngoài những gì Paul Sonier đã mô tả ở trên?
Todd

1
@NirajanSingh Wrapper sử dụng lại hai giao diện đã có sẵn và làm cho một giao diện hoạt động với nhau. Mặt khác, mặt tiền tạo ra một giao diện mới.
Alireza

67

Đúng như tên của nó: một lớp "bao bọc" chức năng của một lớp hoặc API khác trong một API đơn giản hơn hoặc đơn thuần khác nhau.

Xem: Mẫu bộ điều hợp , mẫu mặt tiền


Đúng! Thường là một sự đồng bộ cho mẫu Mặt tiền. Trong nhiều tài liệu mã, tôi thấy phương thức Facade hiển nhiên, được mô tả là "Phương thức Wrapper to XX :: yy" hoặc một đoạn quảng cáo nhỏ như "Phương thức Wrapper to XX :: yy với xử lý ngoại lệ".
Peter Krauss

41

Các lớp Wrapper cung cấp một cách để sử dụng các kiểu nguyên thủy làm đối tượng. Đối với mỗi nguyên thủy, chúng ta có một lớp bao bọc như,

int Integer
byte Byte 

Integer và Byte là các lớp bao của int và byte nguyên thủy. Có những lúc / hạn chế khi bạn cần sử dụng các nguyên hàm làm đối tượng để các lớp bao bọc cung cấp một cơ chế được gọi là đấm bốc / bỏ hộp.

Khái niệm có thể được hiểu rõ bằng ví dụ sau như

double d = 135.0 d;
Double doubleWrapper = new Double(d);

int integerValue = doubleWrapper.intValue();
byte byteValue = doubleWrapper.byteValue();
string stringValue = doubleWrapper.stringValue();

Vì vậy, đây là cách, chúng ta có thể sử dụng loại lớp bao bọc để chuyển đổi thành các loại nguyên thủy khác. Kiểu chuyển đổi này được sử dụng khi bạn cần chuyển đổi một kiểu nguyên thủy thành đối tượng và sử dụng chúng để có được các kiểu nguyên thủy khác. Vì vậy, đối với phương pháp này, bạn cần phải viết một mã lớn. Tuy nhiên, điều tương tự có thể đạt được với kỹ thuật đúc đơn giản vì đoạn mã có thể đạt được như dưới đây

double d = 135.0;
int integerValue = (int) d ;

Mặc dù giá trị kép được chuyển đổi rõ ràng thành giá trị nguyên cũng được gọi là downcasting.


1
Câu trả lời của bạn ngụ ý các lớp bao bọc chỉ dành cho các đối tượng nguyên thủy.
Guillaume F.

17

Một lớp bao bọc không nhất thiết phải bọc một lớp khác. Nó có thể là một chức năng gói lớp API, ví dụ như một tệp dll.

Ví dụ, có thể rất hữu ích khi tạo một lớp bao bọc dll, nó sẽ chăm sóc tất cả các khởi tạo và dọn dẹp dll và tạo các phương thức lớp bao bọc các con trỏ hàm được tạo từ ví dụ GetProcAddress().

Chúc mừng!


8

Một lớp bao bọc là một lớp "bọc" xung quanh một cái gì đó khác, giống như tên của nó.

Định nghĩa chính thức hơn về nó sẽ là một lớp thực hiện Mẫu bộ điều hợp . Điều này cho phép bạn sửa đổi một bộ API thành một dạng dễ đọc hơn. Ví dụ, trong C #, nếu bạn muốn sử dụng API Windows gốc, nó giúp bọc nó thành một lớp phù hợp với các nguyên tắc thiết kế .NET.


2
Theo hiểu biết của tôi về mẫu bộ điều hợp, nó khác với trình bao bọc: nếu X kết thúc Y, thì X sẽ đóng gói trạng thái của Y, nhưng không phải là danh tính của nó . Cho hai trường hợp của X, cả hai đều bao bọc một Y, sẽ không có cách nào để chứng minh rằng cả hai trường hợp của X đều bao bọc cùng một thể hiện của Y. Ngược lại, một đối tượng bộ điều hợp thường sẽ đóng gói nhận dạng nhưng không ở trạng thái; thay đổi đối tượng được điều chỉnh sẽ không được coi là thay đổi đối với bộ điều hợp.
supercat


7

Cũng có thể có giá trị để lưu ý rằng trong một số môi trường, phần lớn những gì lớp bao bọc có thể làm được thay thế bởi các khía cạnh.

BIÊN TẬP:

Nói chung, một trình bao bọc sẽ mở rộng về những gì trình bao bọc thực hiện, mà không cần quan tâm đến việc triển khai trình bao bọc, nếu không thì không có điểm nào bao bọc so với việc mở rộng lớp bọc. Một ví dụ điển hình là thêm thông tin thời gian hoặc chức năng ghi nhật ký xung quanh một số giao diện dịch vụ khác, trái ngược với việc thêm nó vào mỗi lần thực hiện giao diện đó.

Điều này sau đó kết thúc là một ví dụ điển hình cho lập trình Aspect. Thay vì đi qua một chức năng giao diện bằng chức năng và thêm ghi nhật ký soạn thảo, trong lập trình khía cạnh, bạn xác định một điểm cắt, là một biểu thức chính quy cho các phương thức, sau đó khai báo các phương thức mà bạn muốn thực hiện trước, sau hoặc xung quanh tất cả các phương thức khớp các điểm cắt. Có lẽ công bằng khi nói rằng lập trình khía cạnh là một loại sử dụng mẫu Decorator, mà các lớp trình bao bọc cũng có thể được sử dụng, nhưng cả hai công nghệ đều có những cách sử dụng khác.


7

Lớp Wrapper là một lớp bao bọc lớp khác và cung cấp sự trừu tượng giữa lớp khách và lớp gốc được bọc.


5

một lớp bao bọc thường là một lớp có một đối tượng là một thuộc tính riêng. trình bao bọc thực hiện API của đối tượng riêng tư và do đó, nó có thể được chuyển qua làm đối số trong đó đối tượng riêng sẽ làm.

nói rằng bạn có một bộ sưu tập và bạn muốn sử dụng một số loại dịch khi các đối tượng được thêm vào nó - bạn viết một lớp bao bọc có tất cả các phương thức của bộ sưu tập. khi add () được gọi, trình bao bọc dịch các đối số thay vì chỉ chuyển chúng vào bộ sưu tập riêng.

trình bao bọc có thể được sử dụng bất cứ nơi nào một bộ sưu tập có thể được sử dụng và đối tượng riêng vẫn có thể có các đối tượng khác tham chiếu đến nó và đọc nó.


1
Đồng ý, quan điểm cá nhân của tôi về trình bao bọc là chúng trông và cảm giác giống như kiểu ban đầu và có thể thực hiện cùng một giao diện, chắc chắn giữ trạng thái của trường hợp được bao bọc. Chúng tồn tại như một cách để "chặn" các cuộc gọi đến các thành viên.
Luke Puplett

3

Một lớp bao bọc là một lớp được sử dụng để bọc một lớp khác để thêm một lớp gián tiếp và trừu tượng giữa máy khách và lớp ban đầu được bọc.


3

Lớp Wrapper là một lớp bao quanh một kiểu dữ liệu nguyên thủy. Nó đại diện cho các kiểu dữ liệu nguyên thủy trong các thể hiện lớp tương ứng của chúng, ví dụ một kiểu dữ liệu boolean có thể được biểu diễn dưới dạng một thể hiện của lớp Boolean. Tất cả các lớp trình bao bọc nguyên thủy trong Java là bất biến, tức là một khi đã gán một giá trị cho một thể hiện của lớp trình bao bọc thì không thể thay đổi thêm.


3

Lập trình Java cung cấp lớp trình bao bọc cho từng loại dữ liệu nguyên thủy, để chuyển đổi một kiểu dữ liệu nguyên thủy thành đối tượng tương ứng của lớp trình bao bọc.


1

Để làm cho một lớp bọc tốt cũng không phải là một công việc dễ dàng. Để hiểu một lớp bao bọc, nó được thiết kế bởi một số người khác cũng không phải là một công việc dễ dàng. Bởi vì nó là ý tưởng, không phải mã. Chỉ khi bạn hiểu ý tưởng, bạn mới có thể hiểu được trình bao bọc.


0

Các lớp Wrapper ra đời để đáp ứng nhu cầu cơ bản của các lập trình viên - tức là sử dụng các giá trị nguyên thủy ở bất cứ nơi nào chỉ cho phép các Đối tượng. Như tên của chúng cho thấy các lớp bao bọc bao quanh một giá trị nguyên thủy và giữ giá trị trong một Đối tượng. Vì vậy, tất cả những nơi không cho phép nguyên thủy - chẳng hạn như generic, khóa hashmap, Arraylists, v.v. - các lập trình viên hiện có tùy chọn cung cấp các giá trị nguyên thủy này như các loại trình bao bọc tương ứng.

Ngoài ra, các loại trình bao bọc này có một số phương thức tiện ích để chuyển đổi từ loại nguyên thủy sang loại trình bao bọc tương ứng và ngược lại, và từ Chuỗi sang loại trình bao bọc và ngược lại.

Tôi đã viết một bài viết chi tiết về các lớp trình bao bọc trong blog của mình, nó giải thích khái niệm về các loại trình bao bọc theo chiều sâu - http://www.javabrahman.com/corejava/java-wrapper- classes- tutorial-with-examples / (Tiết lộ - Blog này thuộc sở hữu của tôi)


0

Tôi hiện đang sử dụng một lớp bao bọc cho dự án của mình và những lợi ích chính tôi nhận được (chỉ là một lợi ích duy nhất để mở rộng giải thích chủ đề):

Xử lý ngoại lệ: Lớp chính của tôi, một lớp khác kết thúc, có các phương thức đưa ra các ngoại lệ nếu xảy ra bất kỳ, vì vậy tôi đã tạo một lớp bao bọc xử lý các ngoại lệ và ghi lại chúng ngay lập tức. Vì vậy, trong phạm vi chính của tôi, không có xử lý ngoại lệ. Tôi chỉ gọi một phương pháp và làm một cái gì đó.

Sử dụng dễ dàng: Tôi có thể dễ dàng bắt đầu đối tượng. Thông thường giai đoạn bắt đầu được xây dựng của rất nhiều bước.

Khả năng đọc mã: Khi một lập trình viên khác mở mã của tôi, mã sẽ có vẻ rất rõ ràng và dễ thao tác.

Ẩn các chi tiết: Nếu bạn đang tạo một lớp mà một lập trình viên khác sẽ sử dụng, thì bạn có thể gói các chi tiết như "xử lý lỗi, xử lý ngoại lệ, ghi nhật ký và vv ..." để lập trình viên không phải xử lý sự hỗn loạn, chỉ đơn giản là sử dụng các phương pháp.


0

Một lớp bao bọc là một lớp phục vụ mục đích duy nhất là giữ một cái gì đó và thêm một số chức năng cho nó. Trong Java do các nguyên thủy (như ints, float, chars ...) không phải là các đối tượng nên nếu bạn muốn coi chúng như một thì bạn phải sử dụng một lớp bao bọc. Giả sử bạn muốn tạo một Vector của ints, vấn đề là một Vector chỉ giữ các Đối tượng không phải là nguyên thủy. Vì vậy, những gì bạn sẽ làm là đặt tất cả các số nguyên trong một trình bao bọc Integer và sử dụng nó. Thí dụ:

int number = 5;
Integer numberWrapped = new Integer(number);
//now you have the int in an object.
//and this is how to access the int value that is being wrapped.
int again = numberWrapped.intValue();

Điều này được gọi là nguyên thủy đấm bốc hơn là gói.
cyborg

-8

một trình bao bọc là lớp được sử dụng để giao tiếp giữa hai ứng dụng khác nhau giữa các nền tảng khác nhau


Tôi nghĩ rằng bạn có thể sử dụng nó cho nhiều thứ hơn là chỉ một trường hợp đó
Flexo

1
Thật vậy, đây chỉ là một trường hợp sử dụng nhỏ.
praseodym

Tôi nghĩ rằng đây là định nghĩa của các dịch vụ web
Bahadir Tasdemir
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.