Sự khác biệt giữa Loại và Lớp là gì?


Câu trả lời:


121

Câu trả lời sau đây là từ cuốn sách Gof ( Mẫu thiết kế )

Một lớp đối tượng định nghĩa cách đối tượng được triển khai. Lớp xác định trạng thái bên trong của đối tượng và việc thực hiện các hoạt động của nó.

Ngược lại, một đối tượng kiểu chỉ đề cập đến giao diện của nó - một tập hợp các yêu cầu mà nó có thể đáp ứng.

Một đối tượng có thể có nhiều loại và các đối tượng của các lớp khác nhau có thể có cùng loại.

//example in c++
template<typename T> 
const T & max(T const & a,T const &b)
{
return a>b?a:b;  //> operator of the type is used for comparison
}

Hàm max yêu cầu một kiểu có hoạt động> với kiểu riêng của nó là một trong số đó giao diện bất kỳ lớp nào thỏa mãn yêu cầu trên có thể được sử dụng để tạo hàm max cụ thể cho lớp đó.


56

Tôi luôn nghĩ về một "loại" như một thuật ngữ ô cho "các lớp" và "nguyên thủy".

int foo; // Type is int, class is nonexistent.

MyClass foo; // Type is MyClass, class is MyClass


7
giải thích hay và súc tích :)
aku

3
Vâng, trong .NET nó phải giống nhau, thậm chí nguyên thủy là các lớp (hoặc chính xác hơn là các cấu trúc).
dalle

4
@dalle: đồng ý, không có sự khác biệt vốn có giữa loại và lớp. Ví dụ của Eddie rất phụ thuộc vào C ++ / Java. Đó hoàn toàn không phải là định nghĩa.
Robert Gould

Tôi tưởng tượng sẽ khó có được định nghĩa "THE" của "loại" so với một lớp. Vì vậy, nhiều ngôn ngữ có hệ thống gõ riêng của họ. Một định nghĩa tôi nghe được cho .NET là 'loại' bao gồm cả loại ref và giá trị, trong khi một lớp chỉ được sử dụng để mô tả các loại ref.
Eddie Parker

2
Không phải int chỉ là một tay ngắn cho loại System.Int32 sao? Nói cách khác: int foo; // Loại là int, lớp là System.Int32?
Svish

51

Lấy cảm hứng từ Wikipedia ...

Trong thuật ngữ lý thuyết loại ;

  • Một loại là một giao diện trừu tượng.
    Các loại thường đại diện cho danh từ, chẳng hạn như một người, địa điểm hoặc sự vật, hoặc một cái gì đó được đề cử,

  • Một lớp đại diện cho việc thực hiện các loại.
    Nó là một cấu trúc dữ liệu cụ thể và bộ sưu tập các chương trình con

    Các lớp cụ thể khác nhau có thể tạo ra các đối tượng cùng loại trừu tượng (tùy thuộc vào hệ thống loại).

    * Ví dụ, người ta có thể triển khai loại Stack có hai lớp :SmallStack (nhanh cho các ngăn xếp nhỏ, nhưng tỷ lệ kém) và ScalableStack(quy mô tốt nhưng chi phí cao cho các ngăn xếp nhỏ). *

    Tương tự như vậy, một lớp nhất định có thể có khác nhau constructors .

nhập mô tả hình ảnh ở đây

Ví dụ về chuối.

  • Một Banana loại sẽ đại diện cho các thuộc tính và chức năng của chuối nói chung.

  • Các lớpABCBanana và sẽ đại diện cho cách sản xuất chuối. (Các nhà cung cấp chuối khác nhau trong cuộc sống thực, hoặc các cấu trúc dữ liệu và chức năng khác nhau để thể hiện và vẽ chuối trong một trò chơi video).XYZBanana

    Các ABCBananalớp sau đó có thể sản xuất chuối đặc biệt là trường hợp của các ABCBanana lớp , họ sẽ là đối tượng của loại chuối .

Nó không phải là hiếm khi lập trình viên cung cấp một triển khai duy nhất và duy nhất cho một loại. Trong trường hợp này, tên lớp thường trùng với tên loại . Nhưng vẫn còn một loại (có thể được trích xuất trong một giao diện nếu được yêu cầu) và một triển khai (sẽ thực hiện giao diện riêng) để xây dựng các thể hiện (đối tượng) của lớp.


3
Là một người đấu tranh để học trừ khi đưa ra một ví dụ thực tế, điều này thực sự, thực sự đã giúp tôi. Cảm ơn.
alexc95

13

Loại là thuật ngữ ô cho tất cả các mẫu đối tượng hoặc khái niệm có sẵn. Một lớp là một mẫu đối tượng như vậy. Loại cấu trúc, loại Số nguyên, loại Giao diện, v.v ... Đây là tất cả các loại

Nếu bạn muốn, bạn có thể nhìn vào nó theo cách này: Một loại là khái niệm cha. Tất cả các khái niệm khác: Lớp, Giao diện, Cấu trúc, Số nguyên, v.v ... kế thừa từ khái niệm này. Chúng là các loại


4

Loại chứa mô tả của dữ liệu (ví dụ: thuộc tính, hoạt động, v.v.),

Lớp là một loại cụ thể - nó là một khuôn mẫu để tạo các thể hiện của các đối tượng .

Lớp nói đúng là một khái niệm đặc biệt, nó có thể được xem như là một gói chứa tập hợp siêu dữ liệu mô tả một số khía cạnh của một đối tượng.

Ví dụ trong C # bạn có thể tìm thấy các giao diện và các lớp. Cả hai đều là loại, nhưng giao diện chỉ có thể xác định một số hợp đồng và không thể được khởi tạo không giống như các lớp.

Lớp học nói đơn giản là một loại chuyên biệt được sử dụng để đóng gói các thuộc tính và hành vi của một đối tượng.

Wikipedia có thể cung cấp cho bạn một câu trả lời đầy đủ hơn:


4

Để minh họa nó một cách nhanh nhất:

Một cấu trúc là một loại, nhưng một cấu trúc không phải là một lớp.

Như bạn có thể thấy, Loại là một thuật ngữ "trừu tượng" không chỉ cho các định nghĩa về các lớp, mà còn cả các cấu trúc và kiểu dữ liệu nguyên thủy như float, int, bool.


2
Sẽ tốt hơn nếu đề cập đến .net CLR như một ví dụ về khung trong đó tồn tại các loại không phải là các lớp (Java có thể được trích dẫn là một loại khác, mặc dù .net có nhiều loại hơn). Tuy nhiên, một nếp nhăn nhỏ trong .net là Type(viết hoa như được hiển thị) là tên viết tắt của một lớp hệ thống ( System.Type) được sử dụng để giữ các mô tả về các loại.
supercat

3

Loại về mặt khái niệm là một siêu lớp. Theo nghĩa rộng hơn, một lớp là một dạng của loại.

Liên quan chặt chẽ đến các lớp là các giao diện, có thể được xem như là một loại lớp rất đặc biệt - một kiểu hoàn toàn trừu tượng. Đây cũng là loại.

Vì vậy, "kiểu" bao gồm các lớp, giao diện và trong hầu hết các ngôn ngữ nguyên thủy. Ngoài ra các nền tảng như CLR dot-net cũng có các loại cấu trúc.


rajKumar, câu hỏi của bạn khá mơ hồ. Bạn có nói về "loại" như một tính năng của một số ngôn ngữ, hoặc như một khái niệm chung?
aku

Tuy nhiên, không phải tất cả các loại do người dùng định nghĩa là các lớp, ít nhất là không phải trong tất cả các ngôn ngữ.
jalf

jalf, đồng ý nó là một đặc điểm sai. giao diện cũng do người dùng định nghĩa và không thể có loại do người dùng định nghĩa. Lớp là một loại chuyên biệt phục vụ các nhu cầu đặc biệt (tạo các thể hiện của các đối tượng)
aku

Một giao diện đơn giản là một loại đặc biệt, một lớp hoàn toàn trừu tượng - nó vẫn là một loại (theo nghĩa lớn hơn).
Lawrence Dol

Khỉ phần mềm, giao diện không phải là một lớp trừu tượng thuần túy - nó là một khái niệm đặc biệt. "do người dùng định nghĩa" không phải là thuộc tính xác định của các lớp
aku

3

Để thêm một ví dụ khác về sự khác biệt: trong C ++, bạn có các kiểu con trỏ và tham chiếu có thể tham chiếu đến các lớp, nhưng không phải là các lớp trong chính chúng.

Bar b; // b is of type "class Bar"
Bar *b2 = &b; // b2 is of type "pointer to Class Bar"
Bar &b3 = b; // b3 is of type "reference to Class Bar"
Bar *b4[7]; // b4 is of type "7-element array of pointers to Class Bar"
Bar ***b5; //b5 is of type "pointer to a pointer to a pointer to Class Bar"

Lưu ý rằng chỉ có một lớp được tham gia, nhưng có thể sử dụng một số lượng gần như vô hạn các loại. Trong một số ngôn ngữ, hàm được coi là "đối tượng hạng nhất" trong trường hợp đó, loại hàm là một lớp. Ở những người khác, loại hàm chỉ đơn thuần là một con trỏ. Các lớp thường có các khái niệm về khả năng giữ dữ liệu, cũng như các hoạt động trên dữ liệu đó.


3

Suy nghĩ của tôi khá phù hợp với câu trả lời của aku.

Tôi thấy các lớp là một khuôn mẫu để xây dựng các đối tượng, trong khi các kiểu là một cách để phân loại các đối tượng đó và cung cấp cho chúng ta một giao diện cho chúng.

Python cũng thêm siêu dữ liệu, đó chỉ là một cơ chế để xây dựng các lớp, giống như các lớp xây dựng các đối tượng (và tốt, các lớp và siêu dữ liệu đều là các đối tượng).

Câu trả lời này cho cùng một câu hỏi trong lamba cuối cùng đối với tôi giống như một lời giải thích hoàn hảo.


3

Lấy từ trích dẫn của GoF từ bên dưới:

Một lớp đối tượng định nghĩa cách đối tượng được triển khai. Lớp xác định trạng thái bên trong của đối tượng và việc thực hiện các hoạt động của nó.

Ngược lại, một nhân vật kiểu chỉ đề cập đến giao diện của nó -the bộ yêu cầu mà nó có thể đáp ứng.

Tôi muốn cung cấp một ví dụ sử dụng Java:

public interface IType {
}

public class A implements IType {
public A{};
}

public class B implements IType {
public B{};
}

Cả hai lớp ABthực hiện giao diện và do đó là loại IType. Ngoài ra, trong Java, cả hai lớp đều tạo ra kiểu riêng của chúng (tương ứng với tên lớp của chúng). Do đó, lớp Alà loại A IType lớp Blà loại B IType đáp ứng:

Một đối tượng có thể có nhiều loại và các đối tượng của các lớp khác nhau có thể có cùng loại.

Sự khác biệt giữa các kiểu con và lớp con có thể cũng giúp hiểu vấn đề đó:

https://www.cs.princeton.edu/cifts/archive/fall98/cs441/mainus/node12.html


2

Tôi nghĩ về một loại như là tập hợp những điều bạn có thể làm với một giá trị cụ thể. Chẳng hạn, nếu bạn có một giá trị số nguyên, bạn có thể thêm nó vào các số nguyên khác (hoặc thực hiện các phép toán số học khác) hoặc chuyển nó cho các hàm chấp nhận đối số nguyên. Nếu bạn có một giá trị đối tượng, bạn có thể gọi các phương thức trên nó được xác định bởi lớp của nó.

Bởi vì một lớp định nghĩa những gì bạn có thể làm với các đối tượng của lớp đó, một lớp định nghĩa một kiểu. Một lớp còn hơn thế nữa, vì nó cũng cung cấp một mô tả về cách các phương thức được thực hiện (một cái gì đó không được ngụ ý bởi loại) và cách các trường của đối tượng được trình bày.

Cũng lưu ý rằng một giá trị đối tượng chỉ có thể có một lớp, nhưng nó có thể có nhiều loại, vì mỗi siêu lớp cung cấp một tập hợp con của chức năng có sẵn trong lớp của đối tượng.

Vì vậy, mặc dù các đối tượng và loại có liên quan chặt chẽ với nhau, nhưng chúng thực sự không giống nhau.


2

Các loại trong C, như Int Float, char, vv xác định dữ liệu có thể được thực hiện bằng các phương thức cụ thể có thể hoạt động trên chúng. Nó không phức tạp hơn thế. Giống như cho int tôi có thể thêm, trừ nhân và có thể chia. Đó là những phương thức (hoặc thao tác) của tôi cho int. Một lớp chỉ đơn giản là một định nghĩa của một loại mới. Trước tiên tôi xác định dữ liệu trông như thế nào. Có lẽ nó là một chút. Có lẽ đó là hai từ giống như một phức hợp với một phần thực và tưởng tượng. Hoặc có thể điều này phức tạp với 309734325 byte đại diện cho cấu trúc nguyên tử của một hạt lạ trên Sao Mộc. Tôi không quan tâm. Giống như một số nguyên, tôi có thể tạo ra các hoạt động tôi có thể làm với kiểu dữ liệu mới này. Trong trường hợp số nguyên tôi đã thêm, trừ, v.v. Với kiểu dữ liệu mới này, tôi có thể xác định bất kỳ thao tác nào tôi nghĩ có ý nghĩa. Họ có thể được thêm trừ, vv nhưng họ có thể thêm những thứ khác. Đây là bất cứ phương pháp nào tôi quyết định thêm vào lớp học của mình.

Điểm mấu chốt là với một loại trong C, bạn có định nghĩa về dữ liệu là gì, nghĩa là; một byte, word, float, char, v.v ... Nhưng bất kỳ trong số này cũng ngụ ý những hoạt động nào là hợp pháp và sẽ tạo ra kết quả đáng tin cậy.

Một lớp không khác nhau ngoại trừ việc bạn xác định giao diện và các hoạt động có thể chấp nhận được tùy thuộc vào bạn. Lớp định nghĩa những điều này và khi bạn khởi tạo nó trong một đối tượng, nó xác định hành vi của đối tượng giống như một định nghĩa kiểu xác định hành vi của một số nguyên khi bạn thao tác trên nó.

Các lớp học chỉ cho bạn sự linh hoạt để xác định các loại mới và mọi thứ về cách chúng hoạt động.

Khi điều này được định nghĩa, mỗi khi tôi khởi tạo một đối tượng của lớp "thingy", nó có cấu trúc dữ liệu tôi đã định nghĩa và các hoạt động (phương thức) mà tôi đã nói bạn có thể làm với nó. Lớp "thingy" rõ ràng không có gì nhiều hơn hoặc ít hơn một loại mới mà C ++ cho phép tôi định nghĩa.


1

Kiểu thường đề cập đến việc phân loại các giá trị nguyên thủy - số nguyên, chuỗi, mảng, booleans, null, v.v. Thông thường, bạn không thể tạo bất kỳ loại mới nào.

Lớp tham chiếu đến tập các thuộc tính và phương thức được đặt tên mà một đối tượng được liên kết với khi nó được tạo. Bạn thường có thể định nghĩa bao nhiêu lớp mới mà bạn muốn, mặc dù một số ngôn ngữ bạn phải tạo một đối tượng mới và sau đó đính kèm các phương thức vào nó.

Định nghĩa này hầu hết là đúng, nhưng một số ngôn ngữ đã cố gắng kết hợp các loại và các lớp theo nhiều cách khác nhau, với các kết quả có lợi khác nhau.


1
Ngay cả trong ngôn ngữ nghèo nàn loại C, bạn có thể tạo các loại mới, nhưng nó không giống với những gì mọi người thường nghĩ về các lớp ngoại trừ rất nhiều cấu trúc, bản ghi và các lớp giống nhau.
James Iry

1

Các loại và các lớp có liên quan nhưng không giống nhau. Tôi nghĩ rằng các lớp được sử dụng để kế thừa thực hiện, trong khi các kiểu được sử dụng để thay thế thời gian chạy.

Dưới đây là một liên kết giải thích nguyên tắc thay thế và tại sao các lớp con và kiểu con không phải luôn luôn giống nhau (ví dụ trong Java). Các wikipedia trang trên hiệp phương sai và contravariance có thêm thông tin về sự khác biệt này.


1

Theo ý nghĩa bất khả tri của ngôn ngữ nói chung - Lớp là sự hiện thực hóa Loại .

Thông thường khi đây là nhận thức duy nhất của loại đó, bạn có thể sử dụng cả hai thuật ngữ để tham chiếu nó trong một số ngữ cảnh.

Ngược lại, ví dụ, trong ngữ cảnh C # - Class chỉ là một trong nhiều triển khai của khái niệm Loại như nguyên thủy, cấu trúc, con trỏ, v.v.


0

Câu hỏi thú vị. Tôi nghĩ rằng câu trả lời của aku là tại chỗ. Lấy ArrayListlớp java làm ví dụ

public class ArrayList<E> extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

Một thể hiện của ArrayListlớp được cho là thuộc loại siêu lớp mà nó mở rộng và mọi giao diện mà nó thực hiện. Do đó, một thể hiện của ArrayListlớp có một loại ArrayList, RandomAccess, Cloneable, và vân vân. Nói cách khác, các giá trị (hoặc thể hiện) thuộc về một hoặc nhiều loại, các lớp định nghĩa các loại này là gì.


0

Các lớp khác nhau có thể mô tả cùng một loại.

Loại bao gồm những phần này:

  1. Hoạt động = cú pháp
  2. Mô tả hoạt động = ngữ nghĩa

Lớp bao gồm các phần này:

  1. Hoạt động = cú pháp
  2. Triển khai (= triển khai khác nhau mô tả cùng một ngữ nghĩa)

Một số lưu ý:

  • Giao diện (như trong Java) không phải là loại, vì nó không mô tả ngữ nghĩa (chỉ mô tả cú pháp)

  • Lớp con không phải là kiểu con, bởi vì lớp con có thể thay đổi ngữ nghĩa được xác định trong siêu lớp, lớp con không thể thay đổi ngữ nghĩa siêu kiểu (xem Nguyên tắc thay thế Liskov, ví dụ LSP này ).


0

Rõ ràng, vì có các ngôn ngữ với hệ thống loại không phải là ngôn ngữ lập trình OO, loại phải là một khái niệm rộng hơn so với lớp

Ngay cả trong các ngôn ngữ như Java, int là một loại (nguyên thủy), nhưng không phải là một lớp.

Do đó: mỗi lớp là một loại, nhưng không phải mọi loại đều là một lớp.


0

Nếu chúng tôi nghĩ đến câu hỏi này trong ngữ cảnh C #, chúng tôi sẽ đạt được câu trả lời dưới đây.

Hệ thống loại C # được chia thành các loại sau:

Các loại giá trị:

  • Các loại đơn giản: như int, long, float, v.v.
  • Enum các loại
  • Kiểu cấu trúc
  • Các loại không thể

Các loại tham khảo:

  • Các loại lớp
  • Các loại giao diện
  • Các kiểu mảng
  • Các loại đại biểu

Như bạn có thể thấy có nhiều loại trong C # mà Class chỉ là một trong số đó. Chỉ có một lưu ý quan trọng: hệ thống loại của C # được thống nhất sao cho giá trị của bất kỳ loại nào có thể được coi là một đối tượng. Mỗi loại trong C # trực tiếp hoặc gián tiếp xuất phát từ loại lớp đối tượng và đối tượng là lớp cơ sở cuối cùng của tất cả các loại. Giá trị của các loại tham chiếu được coi là các đối tượng đơn giản bằng cách xem các giá trị dưới dạng đối tượng loại. Giá trị của các loại giá trị được coi là đối tượng bằng cách thực hiện các hoạt động đấm bốc và mở hộp.

Vì vậy, như tôi thấy, gõ là một chiếc ô trên nhiều mặt hàng mà lớp là một trong số đó.

Tài liệu tham khảo: Tài liệu đặc tả ngôn ngữ CSahrp, trang 4


-1

Đây là một câu hỏi hay cho tôi, khiến tôi suy nghĩ nhiều. Tôi dám nói rằng Class là một thứ phức tạp và Type là một thứ thời gian chạy. Tôi nói điều này bởi vì bạn viết các lớp không phải loại. Trình biên dịch sau đó tạo các kiểu từ các lớp và thời gian chạy sử dụng các kiểu để tạo các thể hiện của các đối tượng.


1
Chào mừng đến với SO. Câu trả lời này rất giống với ít nhất một người khác và người dùng SO thích ngôn ngữ kỹ thuật hơn là 'điều'!
Nick
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.