2012-09-26 25 views
6

theo http://www.cs.cornell.edu/courses/cs211/2006sp/Lectures/L08-abstraction/08_abstraction.htmlabstraction vs abstract class

trừu tượng có hai hương vị. Một là trừu tượng hàm và phần còn lại là trừu tượng dữ liệu. Nhưng các lớp trừu tượng phù hợp ở đâu? Theo tôi thấy, các lớp trừu tượng là một khái niệm hoàn toàn khác và mặc dù tên cho thấy nó có liên quan đến các nguyên tắc OOP.

Ai đó có thể làm sáng tỏ điều này?

+0

http://www.javacoffeebreak.com/faq/faq0084.html. –

+0

@ crowso- bạn chưa satiesfied với câu trả lời chưa? Xin vui lòng chấp nhận một trong những câu trả lời –

Trả lời

2

Wiki đặt nó rất chính xác

dữ liệu trừu tượng

dữ liệu trừu tượng thực thi một sự tách biệt rõ ràng giữa các tính chất trừu tượng của một kiểu dữ liệu và các chi tiết cụ thể của việc thực hiện. Các thuộc tính trừu tượng là các thuộc tính trừu tượng có thể nhìn thấy mã khách hàng sử dụng kiểu dữ liệu - giao diện cho kiểu dữ liệu - trong khi việc triển khai cụ thể được giữ hoàn toàn riêng tư và thực sự có thể thay đổi, ví dụ như kết hợp các cải tiến hiệu quả theo thời gian. Ý tưởng là những thay đổi như vậy không có nghĩa vụ phải có bất kỳ tác động nào đối với mã máy khách, vì chúng không liên quan đến sự khác biệt trong hành vi trừu tượng. Ví dụ: Ví dụ, người ta có thể định nghĩa một kiểu dữ liệu trừu tượng được gọi là bảng tra cứu kết hợp duy nhất các khóa với các giá trị, và trong đó các giá trị có thể được lấy ra bằng cách chỉ định các khóa tương ứng của chúng. Bảng tra cứu như vậy có thể được thực hiện theo nhiều cách khác nhau: dưới dạng bảng băm, cây tìm kiếm nhị phân hoặc thậm chí một danh sách tuyến tính đơn giản gồm các cặp (khóa: giá trị) đơn giản. Theo như mã khách hàng là có liên quan, các thuộc tính trừu tượng của loại là như nhau trong mỗi trường hợp.

Hãy xem xét ví dụ một đoạn Java mẫu để đại diện cho một số trang trại phổ biến "động vật" đến mức trừu tượng phù hợp để mô hình các khía cạnh đơn giản của nạn đói và cho ăn của chúng. Nó định nghĩa một lớp động vật để đại diện cho cả hai trạng thái của động vật và chức năng của nó:

public class Animal extends LivingThing 
{ 
    private Location loc; 
    private double energyReserves; 

    public boolean isHungry() { 
     return energyReserves < 2.5; 
    } 
    public void eat(Food f) { 
     // Consume food 
     energyReserves += f.getCalories(); 
    } 
    public void moveTo(Location l) { 
     // Move to new location 
     loc = l; 
    } 
} 

Với định nghĩa trên, ta có thể tạo các đối tượng của loại động vật và gọi các phương thức của họ như thế này:

thePig = new Animal(); 
theCow = new Animal(); 
if (thePig.isHungry()) { 
    thePig.eat(tableScraps); 
} 
if (theCow.isHungry()) { 
    theCow.eat(grass); 
} 
theCow.moveTo(theBarn); 
0

Các đối tượng nói chung kết hợp dữ liệu với chức năng, và một lớp trừu tượng không là ngoại lệ cho điều đó. Trong một số trường hợp, trừu tượng được cung cấp gần như là dữ liệu thuần túy, với các chức năng chỉ cung cấp quyền truy cập vào dữ liệu (ví dụ: các lớp thu thập). Các trường hợp khác gần như ngược lại (ví dụ, trừu tượng được cung cấp bởi một hàm trong C++ thường khá nhiều hàm).

Tất nhiên, đó là khá nhiều điểm cực đoan - nhiều lớp (nhiều nhất?) Nằm ở đâu đó giữa chúng.

+0

yeah đây là đối số của tôi. Nhưng bạn chưa đề cập đến lớp trừu tượng và khái niệm trừu tượng liệu hai khái niệm đó có giống nhau hay khác nhau không? – crowso

+0

@ user581544: Điểm của tôi là một lớp trừu tượng * có thể * đại diện cho cả hai hoặc cả hai với các mức độ khác nhau. –

5

Đây là những khái niệm rất khác nhau.

Trừu tượng tương tự như khái niệm về hộp đen. Đầu vào đi vào, hộp đen làm điều gì đó, đầu ra đi ra. Nó không quan trọng những gì xảy ra trong hộp đen, tất cả những gì bạn cần biết là nó hoạt động. Một ví dụ thực tế về điều này là hàm băm của java, tất cả người dùng phải biết là nó băm giá trị đầu vào, nó không quan trọng đối với người dùng làm thế nào số được băm. Hộp đen là trừu tượng. Vấn đề là bạn không cần phải biết nó hoạt động như thế nào.

Lớp trừu tượng (ít nhất là trong Java) là một hỗn hợp giữa các giao diện và các lớp OOP đầy đủ. Một giao diện định nghĩa các phương thức mà bất kỳ lớp mở rộng nào phải có, đó là một thỏa thuận trong mã mà nó sẽ thực hiện giao diện đúng và đảm bảo mọi thứ sẽ hoạt động như mong đợi.Một lớp trừu tượng có các phương thức trống (các thỏa thuận) và cũng có các phương thức được triển khai đầy đủ có thể được gọi.

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