2012-04-18 24 views
20

Tôi hiểu TẠI SAO chúng ta cần Lớp Tóm tắt trong Java - để tạo các lớp con. Nhưng điều tương tự cũng có thể đạt được bằng lớp bê tông. ví dụ. Lớp con mở rộng phụ huynh. Ở đây cha mẹ có thể rất trừu tượng & bê tông. Vậy tại sao chúng ta có ABSTRACT ??Lớp trừu tượng khác với lớp bê tông như thế nào?

+8

Animal animal = new Animal(); << động vật gì? trong nhiều trường hợp, điều này không có ý nghĩa, do đó các lớp trừu tượng. Bạn không thể tạo một cá thể trực tiếp. Nó phải là một kiểu phụ như một con mèo hay con chó hay bất cứ điều gì – Polity

+2

lập trình giống nhau có thể đạt được nếu chúng ta có động vật như một lớp bê tông. Tôi chỉ đang cố gắng hiểu lý do đằng sau việc giới thiệu một khái niệm về TÓM TẮT bởi những người sáng tạo java. –

+0

Nó giới hạn sự thừa của mã và cũng làm tăng hiệu quả. Hơn nữa nó có thể áp đặt rằng một số chức năng không đầy đủ của lớp trừu tượng được sử dụng trong lớp bê tông. Giống như kết hợp một giao diện và lớp với nhau và bạn không phải thực hiện giao diện trong tất cả các lớp cụ thể của bạn. –

Trả lời

43

Lớp trừu tượng không thể được khởi tạo trực tiếp. Khai báo một lớp là abstract có nghĩa là bạn không muốn nó được khởi tạo và lớp đó chỉ có thể được kế thừa. Bạn đang áp đặt một quy tắc trong mã của mình.

Nếu bạn mở rộng ví dụ về mối quan hệ cha mẹ/con của bạn hơn nữa để bao gồm một lớp Person thì sẽ có ý nghĩa tốt đối với Person là abstract. Cha mẹ là một ý tưởng cụ thể và như vậy là đứa trẻ. Con người là một khái niệm trừu tượng trong thực tế cũng như trong mã.

Một lợi ích là bạn rõ ràng xác định và bảo vệ ý tưởng của lớp trừu tượng. Khi bạn khai báo một lớp như là một trừu tượng, không có cách nào mà bạn hoặc bất kỳ ai khác sử dụng mã của bạn sử dụng nó không chính xác bằng cách khởi tạo nó. Lý do này tương tự như lý do tại sao chúng tôi chỉ định các hàm và trường như công khai, riêng tư hoặc được bảo vệ. Nếu bạn khai báo một hàm hoặc thành viên riêng tư, bạn có hiệu lực bảo vệ nó khỏi truy cập không đúng từ mã máy khách. Các cá nhân có nghĩa là được sử dụng trong lớp và đó là nó. Các lớp trừu tượng có nghĩa là được kế thừa và đó là điều đó.

Bây giờ, bạn có phải sử dụng lớp trừu tượng và xác định các chức năng và trường là riêng tư thay vì công khai không? Không, bạn không. Nhưng những khái niệm này được cung cấp để giúp giữ mã sạch sẽ và được tổ chức tốt. Lớp trừu tượng được thực hiện trong tất cả các ngôn ngữ hướng đối tượng đến kiến ​​thức của tôi. Nếu bạn nhìn xung quanh, bạn sẽ thấy rằng C++, C#, VB.NET vv tất cả đều sử dụng khái niệm này.

Một tốt hơn, ví dụ cụ thể:

Shape hierarchy UML Diagram

Trong ví dụ trên lớp Shape nên trừu tượng bởi vì nó không phải là hữu ích ngày của riêng mình.

+2

nhưng chúng ta có được lợi ích gì khi áp dụng quy tắc này? –

+1

Sử dụng lại mã. Thực hiện hàm trong lớp trừu tượng và bây giờ tất cả các lớp con có phương thức được triển khai. Điều này thường được sử dụng khi triển khai thực hiện các giao diện và nhiều triển khai chia sẻ cùng một mã cho một số phương thức. –

+1

Tôi nghĩ rằng cha mẹ/con/người là một tương tự xấu cho giải thích trừu tượng và thừa kế: một người luôn luôn là một đứa trẻ (của hai người khác) và nó là rất phổ biến rằng sau một thời điểm họ cũng là một phụ huynh (của một số khác người (s)). –

6

Lớp trừu tượng có nghĩa là tóm tắt chưa hoàn chỉnh. Nó cần một lớp khác để hoàn thành nó và/hoặc các chức năng của nó. Bạn cần mở rộng lớp trừu tượng. Nó sẽ hữu ích với một số lớp ví dụ. Trái cây tất cả các loại trái cây có cùng một tài sản giống như màu sắc. Nhưng bạn có thể có các thuộc tính khác nhau cho các loại trái cây khác nhau như là nó có màu như cam hay không, ví dụ như chuối, v.v.

+0

nhưng điểm giống nhau có thể đạt được bằng một lớp bê tông. Tôi đang cố gắng để hiểu nếu có bất cứ điều gì vượt ra ngoài thực tế là lớp trừu tượng là có cho các lớp học là LOGICALLY không cụ thể hoặc là có cái gì nhiều hơn? –

+1

Trong trường hợp đó, câu trả lời là không. Bạn có thể có toàn bộ ứng dụng của bạn (thậm chí 100KLOC +) trong một lớp. Nhưng chúng tôi không, và chúng tôi tạo ra các lớp khác nhau cho các thực thể khác nhau. Lớp trừu tượng cải thiện cấu trúc của chương trình –

3

Điểm trừu tượng không phải là tạo ra các lớp con. Đó là thêm về việc tạo Seams trong mã của bạn. Bạn muốn mã có thể kiểm tra và tách ra, dẫn đến mục tiêu cuối cùng của tính bảo trì. Vì lý do tương tự, trừu tượng cũng mua cho chúng ta khả năng thay thế một chút mã mà không có tác dụng phụ gợn sóng.

4

Tôi biết đây là câu hỏi cũ nhưng có vẻ như người đăng vẫn có một số câu hỏi về lợi ích của việc sử dụng lớp trừu tượng.

Nếu bạn là người duy nhất sẽ sử dụng mã của bạn thì thực sự không có lợi ích. Tuy nhiên, nếu bạn đang viết mã cho người khác sử dụng thì có một lợi ích. Ví dụ, bạn đã viết một khung bộ nhớ đệm nhưng muốn cho phép các máy khách tạo các lớp thực hiện bộ nhớ đệm của riêng chúng. Bạn cũng muốn theo dõi một số chỉ số, chẳng hạn như số lượng cache được mở, theo giả thuyết.lớp trừu tượng của bạn có thể trông giống như thế này:

public abstract class AbstractCache { 
    public final void open() { 
     ... // Do something here to log your metrics 
     openImpl(); 
    } 

    protected abstract void openImpl() { } 
} 

On riêng lớp AbstractCache là vô ích và bạn không muốn khách hàng để cố gắng thể hiện hóa một và sử dụng nó như một bộ nhớ cache, mà họ sẽ có thể làm nếu lớp học được cụ thể. Bạn cũng muốn đảm bảo rằng họ không thể bỏ qua ghi nhật ký số liệu của bạn, điều họ có thể thực hiện nếu bạn chỉ cung cấp cho họ giao diện Bộ nhớ cache.

2

Lớp trừu tượng có nghĩa là được sử dụng làm lớp cơ sở mà từ đó các lớp khác bắt nguồn. Lớp dẫn xuất dự kiến ​​sẽ cung cấp các triển khai thực hiện cho các phương thức không được triển khai trong lớp cơ sở. Một lớp học có nguồn gốc mà thực hiện tất cả các chức năng còn thiếu được gọi là một lớp bê tông

0

Theo hiểu biết của tôi

Tóm tắt Lớp là một lớp mà chỉ mô tả hành vi nhưng không thực hiện nó. Hãy xem xét ví dụ Java này cho Abstract Class:

public interface DoSomething(){ 
public void turnOnTheLight(); 
} 

bê tông Lớp là những, những chất này được thực hiện. Ví dụ:

public abstract class A(){ 
     public void doIt(); 
    } 
    public class B extends A(){ 
     public void doIt(){ 
     //concrete method 
     System.out.println(“I am a Concrete Class Test”); 
    } 
} 

Nói cách khác, Một lớp bê tông trong java là bất kỳ lớp như vậy trong đó có thực hiện tất cả các thành viên được thừa hưởng của nó hoặc từ giao diện hoặc lớp trừu tượng.

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