Đừng nhầm lẫn với Kiểu dữ liệu trừu tượng.
Trong ngôn ngữ lập trình, **kiểu trừu tượng** (tiếng Anh: *abstract type*) là một kiểu trong hệ thống kiểu danh định mà không thể được khởi tạo trực tiếp; một kiểu mà không trừu tượng – nghĩa là *có thể* được khởi tạo – được gọi là *kiểu cụ thể* (*concrete type*). Mỗi thực thể của kiểu trừu tượng là một thực thể của vài kiểu con cụ thể. Kiểu trừu tượng còn được gọi là *kiểu tồn tại* (existential type).

Một kiểu trừu tượng có thể không cung cấp sự hiện thực, hoặc hiện thực không đầy đủ. Ở một vài ngôn ngữ, kiểu trừu tượng không có sự hiện thực (thay vì hiện thực không đầy đủ) được gọi là *giao thức* (*protocol* hay *interface*), *chữ kí* (*signature*), hay *kiểu lớp* (*class type*). Trong lập trình hướng đối tượng dựa trên lớp, kiểu trừu tượng được hiện thực như là *lớp trừu tượng* (*abstract class* hay *abstract base class*), và kiểu cụ thể như là *lớp cụ thể* (*concrete class*).

Định nghĩa các loại trừu tượng
------------------------------

Lớp trừu tượng có thể được tạo ra, định nghĩa, hay mô phỏng, theo nhiều cách:

* Bằng cách sử dụng từ khóa `abstract` trong định nghĩa lớp, như trong Java, D hay C#.
* Bằng cách thêm vào, trong định nghĩa lớp, một hay nhiều phương thức trừu tượng (gọi là các *hàm ảo thuần túy* trong C++), mà lớp dược khai báo để chấp nhận như là một phần giao thức của nó, nhưng không có hiện thực nào được cung cấp.
* Bằng cách kế thừa từ một kiểu trừu tượng, nhưng không ghi đè tất cả các tính năng cần thiết để hoàn thành định nghĩa lớp.
* Một số ngôn ngữ kiểu động như Smalltalk, bất kì lớp này gửi một phương thức cụ thể tới **this**, nhưng không hiện thực phương thức đó, thì có thể được xem là trừu tượng. (Tuy nhiên, trong nhiều ngôn ngữ, Objective-C, lỗi không được phát hiện đến khi lớp được sử dụng, và thông báo trả về kết quả trong lỗi ngoại lệ như "Does not recognize selector: xxx" as `- [NSObject doesNotRecognizeSelector:(SEL)selector]` được gọi khi phát hiện phương thức chưa được hiện thực).

### Ví dụ (Java)

```
//By default, all methods in all classes are concrete, unless the abstract keyword is used.
abstract class Demo {
 // An abstract class may include abstract methods, which have no implementation.
 abstract public int sum(int x, int y);

 // An abstract class may also include concrete methods.
 public int product(int x, int y) { return x\*y; }
}

//By default, all methods in all interfaces are abstract, unless the default keyword is used.
interface DemoInterface {
 [abstract] int getLength(); //Abstract can be used here, though is completely useless
 
 //The default keyword can be used in this context to specify a concrete method in an interface
 default int product(int x, int y) {
 return x \* y;
 }
}

```

Cách dùng kiểu trừu tượng
-------------------------

Xem thêm
--------

* Lớp (lập trình máy tính)

Tham khảo
---------

1. ↑  Mitchell, John C.; Plotkin, Gordon D.; *Abstract Types Have Existential Type*, ACM Transactions on Programming Languages and Systems, Vol. 10, No. 3, July 1988, pp. 470–502

Đọc thêm
--------

* *Head First Java*. O'Reilly Media. 2003. tr. 688. ISBN 0-596-00920-8.
* Core Java: An Integrated Approach by R. Nageswara Rao

Liên kết ngoài
--------------

* "Abstract or Skeletal Interfaces Explained"
* *Types and Programming Languages* by Benjamin Pierce (MIT Press 2002)
* *Abstract type* at Rosetta Code