Tại sao các biến cần một loại?


10

Vì vậy, chúng tôi viết:

Customer c = new Customer();

Tại sao thiết kế không phải là như vậy mà chúng tôi viết:

c = new Customer();
c.CreditLimit = 1000;

Trình biên dịch có thể tìm ra điểm c cho Khách hàng và cho phép các thành viên của Khách hàng được gọi trên c?

Tôi biết chúng tôi có thể muốn viết:

IPerson c = new Customer();
IPerson e = new Employee();

để có thể viết:

public string GetName(IPerson object)
{
    return object.Name
}

string name = GetName(c); // or GetName(e);

Nhưng nếu chúng tôi viết:

c = new Customer();
e = new Employee();

chúng ta vẫn có thể viết:

public string GetName(object)
{
    return object.Name
}    

string name = GetName(c); // or GetName(e);

Trình biên dịch có thể khiếu nại về mã ngay lập tức nếu loại tham chiếu c của đối tượng không hỗ trợ thuộc tính Tên (vì nó có thể kiểm tra thành viên nào được sử dụng trên đối số / tham số trong phương thức) hoặc thời gian chạy có thể khiếu nại.

Ngay cả với từ khóa động của C #, chúng tôi vẫn đang sử dụng một biến 'loại' (được xác định khi chạy). Nhưng tại sao một biến cần một loại ở tất cả? Tôi chắc chắn phải có một lý do chính đáng, nhưng tôi không thể nghĩ về nó!


12
Đây là lý do tại sao có các ngôn ngữ động như Python và Ruby (và các ngôn ngữ khác). Không có câu trả lời cho câu hỏi này. Thực tế là một số ngôn ngữ sử dụng khai báo kiểu và một số ngôn ngữ thì không.
S.Lott

2
"các biến trong các ngôn ngữ đó không có loại nào cả?" Chính xác. các biến không có kiểu trong Python. Các đối tượng có một loại và các biến chỉ đơn giản là tham chiếu đến các đối tượng. Câu hỏi của bạn thực sự chỉ là một quan sát. Cụ thể "không phải tất cả các ngôn ngữ đều yêu cầu khai báo biến". Không có câu trả lời. Vì vậy, nó có khả năng sẽ bị đóng cửa vì không mang tính xây dựng.
S.Lott

1
Bạn có thể muốn xem Boo , cho phép bạn khai báo các biến mà không cần bất kỳ khai báo kiểu nào nhưng sử dụng suy luận kiểu để tìm ra các loại để bạn không hy sinh tính chính xác và lợi ích hiệu suất của việc gõ mạnh.
Mason Wheeler

2
var x = 1; - ý của bạn là 32 bit, 64 bit, 16 bit? byte? Phao nổi? gấp đôi? số thập phân? Đây chỉ là đối phó với người nguyên thủy.
Công việc

4
Bạn có thể sử dụng vartrong C # và thông báo về nơi bạn muốn khai báo một biến luôn tốt.
Daniel Little

Câu trả lời:


22

Nhưng tại sao một biến cần một loại ở tất cả?

  1. Điều này có thể bắt lỗi trong đó một biểu thức gõ sai, không hợp lệ được gán cho một biến. Một số ngôn ngữ có kiểu gõ động , hy sinh tính bảo đảm chính xác của một loại cho mỗi biến cho loại linh hoạt mà bạn dường như mong muốn.
  2. Các loại có thể cho phép trình biên dịch tạo mã hiệu quả hơn. Gõ động có nghĩa là kiểm tra loại phải được thực hiện trong thời gian chạy.

1
Hãy giải thích các downvote.
Fred Foo

4
Ngoài ra, gõ động có chi phí hiệu năng, bởi vì thông tin loại cần được kiểm tra trong thời gian chạy.
Charles Salvia

@CharlesSalvia: điểm hay, thêm vào câu trả lời.
Fred Foo

2
@sturdytree: như đối với "nếu nó không có loại, thì nó không thể gõ sai" - theo như các quy tắc ngôn ngữ, điều đó đúng. Nhưng biến vẫn có thể được gán sai loại theo quan điểm ngữ nghĩa , ví dụ: bạn nhập sai tên của hàm tạo và chương trình vẫn chạy, nhưng không làm những gì bạn muốn.
Fred Foo

5
@sturdytree Mặc dù đúng là không có ngôn ngữ nào có các biến thực sự không đánh máy với kiểm tra kiểu, có những ngôn ngữ có kiểu suy luận . Điều đó có nghĩa là, ngôn ngữ xem xét cách sử dụng biến của bạn và suy ra loại từ cách sử dụng của bạn. Nếu có xung đột (ví dụ: bạn thực hiện a = new Bar()và sau đó gọi một phương thức từ lớp Baz), trình biên dịch sẽ phát sinh lỗi. Các ngôn ngữ như Haskell và OCaml tiên phong loại suy luận, nhưng nó có trong C #, với vartừ khóa.
tử

9

Bạn có một điểm hoàn toàn hợp lệ, các ngôn ngữ không theo dõi loại biến tồn tại và được gọi là "gõ động". Danh mục này bao gồm các ngôn ngữ như JavaScript, Perl, Lisp và Python.

Ưu điểm mà chúng tôi nhận được từ một ngôn ngữ gõ tĩnh là một số kiểm tra lỗi thời gian biên dịch bổ sung.

Giả sử, ví dụ, bạn có phương pháp sau:

public addCustomerContact(Customer client, Employee contact) {
   ...
} 

Có thể, nếu bạn có một khách hàng bobvà một nhân viên jamestrong mã của bạn, gọi nhầm addCustomerContact(james, bob), không hợp lệ. Nhưng nếu trình biên dịch không biết các loại biến, thì nó không thể cảnh báo bạn rằng bạn đã thực hiện một cuộc gọi không hợp lệ, thay vào đó, một lỗi xảy ra trong thời gian chạy ... và vì các ngôn ngữ được gõ động không kiểm tra loại tham số được truyền vào các phương thức, vấn đề đó xảy ra bất cứ khi nào mã của bạn cố sử dụng các thuộc tính chỉ dành cho khách hàng của jamesđối tượng hoặc thuộc tính chỉ dành cho nhân viên của bobđối tượng. Đó có thể là rất lâu sau khi cặp (james, bob) được thêm vào danh sách liên hệ của khách hàng.

Bây giờ, bạn có thể tự hỏi, tại sao trình biên dịch vẫn không thể suy ra loại jamesbob, và vẫn cảnh báo chúng ta? Điều đó đôi khi có thể có thể, nhưng nếu các biến thực sự không có loại, thì chúng ta có thể làm như sau:

var james;
var bob;
if (getRandomNumber() > 0.5) {
   james = new Customer();
   bob = new Employee();
} else {
   james = new Employee();
   bob = new Customer();
}

Hoàn toàn hợp pháp khi gán bất kỳ giá trị nào cho bất kỳ biến nào, vì chúng tôi đã nói các biến không có loại. Điều đó cũng có nghĩa là chúng ta không thể luôn biết loại biến, bởi vì nó có thể thuộc các loại khác nhau dựa trên các đường thực hiện khác nhau.

Nói chung, các ngôn ngữ được gõ động được sử dụng cho các ngôn ngữ kịch bản, trong đó không có bước biên dịch và do đó, lỗi biên dịch không tồn tại, có nghĩa là các tổ hợp phím bổ sung cần thiết để cung cấp loại biến sẽ không hữu ích.

Cũng có một số lợi thế khác biệt đối với các ngôn ngữ được gõ động, chủ yếu là về việc cần ít mã hơn để thực hiện cùng một thiết kế: giao diện không cần phải viết, bởi vì mọi thứ đều là "vịt gõ" (chúng tôi chỉ quan tâm phương thức / thuộc tính nào mà đối tượng có , không phải lớp nào mà đối tượng thuộc về), các biến không cần phải được đưa ra loại rõ ràng ... với sự đánh đổi mà chúng ta tìm ra về một số lỗi ít hơn trước khi chúng ta bắt đầu chạy mã của mình.


Cảm ơn Theodore. "Nhưng nếu trình biên dịch không biết các loại biến, thì nó không thể cảnh báo bạn rằng bạn đã thực hiện một cuộc gọi không hợp lệ" Như bạn đã đề cập, trình biên dịch có thể biết các loại đối tượng mà các biến chỉ đến.
mạnh mẽ

Theodore: Trong ví dụ của bạn james / bob, chúng ta nên lập trình viên biết cách chúng ta đã sử dụng các biến của mình (và giúp đặt tên tốt) và vì vậy tôi không thấy vấn đề gì với nó. Khi bạn nói "chúng tôi không thể luôn biết loại biến" Tôi giả sử bạn có nghĩa là chúng tôi không thể luôn biết loại đối tượng mà biến chỉ đến, nhưng trình biên dịch có thể giải quyết vấn đề này và vì vậy cảnh báo về các thành viên không chính xác áp dụng (tức là chúng ta có thể kiểm tra tĩnh).
mạnh mẽ

2
Tôi đã đưa ra một ví dụ ở trên, trong đó bạn không thể biết các loại đối tượng một cách tĩnh ... tùy thuộc vào đường dẫn thực hiện, loại đối tượng được lưu trữ trong một biến không có thông tin loại có thể khác nhau. Bạn có thể có một ngôn ngữ như C # trong đó thông tin loại thời gian biên dịch có thể được suy ra, nhưng, theo tôi biết, không có ngôn ngữ nào có cả biến kiểm tra kiểu tĩnh và biến thực sự không chính xác, độ phức tạp tính toán của phân tích tĩnh cũng có khả năng tuyệt quá.
Theodore Murdock

Theodore, cảm ơn, bạn đã hiểu chính xác rằng những gì tôi đang nói là một ngôn ngữ với kiểm tra kiểu tĩnh (dựa trên loại đối tượng) và các biến không đánh máy. Thật buồn khi không có ai - Tôi đã nói Python có các biến không đánh máy, nhưng có vẻ như nó không có kiểm tra kiểu tĩnh.
mạnh mẽ

1
-1; gõ mạnh / yếu là trực giao với gõ tĩnh / động. C được gõ tĩnh điện; Lisp và Python đều được gõ mạnh mẽ.
Fred Foo

5

Vì vậy, các lập trình viên chuyên nghiệp không phải tìm hiểu xem

10 + "10"

is "1010" or 20....

Đó là một lỗi, tại thời gian biên dịch với ngôn ngữ được nhập tĩnh hoặc thời gian chạy với một ngôn ngữ được gõ động. Vâng, những người lành mạnh nào.


2
Tức là, Perl không phải là một ngôn ngữ lành mạnh? :)
Fred Foo

5
@larsmans: như một vấn đề thực tế, không, không phải vậy. Nhưng đó hoàn toàn là ý kiến.
NotMe

2
@ChrisLively: Tôi rất vui vì đây là vấn đề thực tế. Hãy đến nơi làm việc của tôi bất cứ lúc nào để thuyết phục các đồng nghiệp yêu mến Perl của tôi;)
Fred Foo

2
10 + "10" đang sử dụng toán tử '+' trên đối tượng có kiểu nguyên và đối tượng của kiểu chuỗi. Trình biên dịch sẽ đưa ra một lỗi. Câu hỏi của tôi là làm gì với loại biến chứ không phải đối tượng.
mạnh mẽ

2
hợp lệ C: Đó là số học con trỏ.
dan04

4

Giả sử bạn có một biến one(đặt thành 1) và cố gắng đánh giá one + one. Nếu bạn không có ý tưởng về loại, thì 1 + 1 sẽ mơ hồ. Bạn có thể lập luận rằng 2 hoặc 11 có thể là câu trả lời đúng. Nó trở nên mơ hồ nếu bối cảnh không được đưa ra.

Tôi đã thấy điều này xảy ra trong SQLite khi các loại cơ sở dữ liệu vô tình được đặt thành VARCHARthay vì INTvà khi các hoạt động được thực hiện, mọi người sẽ nhận được kết quả không mong muốn.

Trong c # nếu bối cảnh là một loại, bạn có thể sử dụng vartừ khóa.

var c = new Customer();
var e = new Employer();

Sẽ biên dịch c và e với các kiểu suy ra tại thời gian biên dịch.


1
Trong Python, 1 + 1luôn có kiểu int, nhưng không cần phải khai báo điều đó. Câu hỏi là tại sao các biến có một loại, không phải các giá trị .
Fred Foo

Xin lỗi bạn có nghĩa là variableskhông nhìn thấy valueskhi tôi sử dụng 1 + 1trong ví dụ của tôi. Tôi đoán nó không rõ ràng.
Stephen Quan

Tuy nhiên, các ngôn ngữ gõ động có thể đối phó với điều này. Trong Python, one=1; print(one+one)in 2. one="1"; print(one+one)bản in 11. Ví dụ SQLite có sức thuyết phục hơn, nhưng vấn đề là có một kiểu gõ yếu, vì vậy nó không thực sự liên quan đến C #.
Fred Foo

Trong sơ đồ được đề xuất của tôi, one = 1 có nghĩa là một biến chỉ đến một kiểu số nguyên (tôi không đề xuất không có loại nào cả - các đối tượng sẽ có một loại). một + một sau đó sẽ không mơ hồ (chúng tôi đang thêm hai đối tượng / giá trị số nguyên)
mạnh mẽ

1
Xin chào @ dan04, tôi đã thấy nó ORDER BYvô tình được thực hiện trên một VARCHARlĩnh vực. Xem stackoverflow.com/questions/9103313/ cấp .
Stephen Quan

4

Một biến không cần phải có một loại liên quan. Các ngôn ngữ mà điều này đúng bao gồm Lisp, Scheme, Erlang, Prolog, Smalltalk, Perl, Python, Ruby và các ngôn ngữ khác.

Một biến cũng có thể một loại, nhưng bạn có thể không phải viết loại đó trong chương trình. Điều này thường được gọi là suy luận kiểu. ML, Haskell và con cháu của họ có kiểu suy luận mạnh mẽ; một số ngôn ngữ khác có nó ở dạng ít hơn, chẳng hạn như autokhai báo của C ++ .

Đối số chính chống lại suy luận kiểu là nó làm hỏng khả năng đọc. Thông thường mã dễ hiểu hơn khi các loại được viết ra.


1

Khi bạn xác định loại mà biến của bạn đại diện, bạn đang đưa ra tuyên bố về một vài điều. Bạn đang xác định các yêu cầu cấp phát bộ nhớ cho biến của mình và bạn đang xác định các quy tắc tương thích và phạm vi cho biến của mình. Nó cung cấp một cách để tránh nhầm lẫn về ý định của bạn đối với dữ liệu bạn đang lưu trữ và cung cấp cho bạn một phương tiện tương đối rẻ để xác định các vấn đề tiềm ẩn trong mã của bạn tại thời điểm biên dịch.

Nếu bạn khai báo các biến sau:

myVar      = 5;
myOtherVar = "C";

Bạn có thể suy luận gì về các biến này? Được myVarký hoặc không dấu? Có phải là 8 bit, 64 bit, hoặc một cái gì đó ở giữa không? Là myOtherVarmột Chuỗi (có hiệu quả là một mảng) hay Char? Nó là ANSI hay Unicode?

Bằng cách cung cấp các loại dữ liệu cụ thể, bạn cung cấp cho trình biên dịch các manh mối về cách nó có thể tối ưu hóa các yêu cầu bộ nhớ cho ứng dụng của bạn. Một số ngôn ngữ không bận tâm nhiều đến vấn đề này, cho phép giải quyết những vấn đề đó trong thời gian chạy, trong khi các ngôn ngữ khác sẽ cho phép một số kiểu gõ động nhất định vì bằng cách phân tích mã, các loại dữ liệu có thể được suy ra.

Một điểm khác với các ngôn ngữ được gõ mạnh, là nó giúp bạn không cần phải cung cấp hướng dẫn cho trình biên dịch mỗi khi bạn sử dụng một biến. Bạn có thể tưởng tượng mã của bạn sẽ trở nên khủng khiếp và khó đọc đến mức nào không nếu mỗi lần bạn truy cập vào một biến, bạn buộc phải sử dụng nó một cách hiệu quả để báo cho trình biên dịch biết loại giá trị đó là gì? !!


Điểm hay, mặc dù trình biên dịch chỉ có thể sử dụng loại hiệu quả nhất (ví dụ int nhỏ) dựa trên giá trị, tôi có thể thấy rằng chúng ta có thể muốn "C" là một đối tượng chuỗi thay vì char để có thể thực hiện các hoạt động nhất định . Trong những trường hợp như vậy, chúng ta chỉ có thể chỉ định a = (chuỗi) "C". Điều này tạo ra một đối tượng chuỗi và 'a' (biến không được đánh dấu) chỉ trỏ đến nó. Tôi không thấy điều này kinh khủng hơn chuỗi a = "C";
mạnh mẽ

0

Chương trình máy tính là một biểu đồ gồm các nút quá trình mô tả "máy", được biểu thị bằng thời gian chạy ngôn ngữ (được mở rộng bằng bộ công cụ trong hầu hết các trường hợp) nên làm theo thứ tự hoặc trong điều kiện nào. Biểu đồ này được biểu thị bằng một tệp văn bản (hoặc một bó các tệp văn bản) được viết bằng một ngôn ngữ cụ thể và (một phần hoặc toàn bộ) được tạo khi trình biên dịch / trình thông dịch đọc (giải tuần tự hóa) tệp này. Ngoài ra, có một số môi trường (UML hoặc các công cụ tạo chương trình đồ họa) nơi bạn thực sự có thể xây dựng biểu đồ này và tạo mã nguồn bằng ngôn ngữ đích.

Tại sao tôi nói điều này? Bởi vì điều này dẫn đến câu trả lời cho câu hỏi của bạn.

Văn bản chương trình của bạn là hướng dẫn của bạn về cách máy tính sẽ giải quyết công việc thực tế, bao gồm cả các bước quy trình (điều kiện, hành động) VÀ cấu trúc (bạn sử dụng thành phần nào trong giải pháp). Cái sau có nghĩa là bạn có được hoặc tạo một số phiên bản của các thành phần khác, đặt chúng vào các hộp (biến) được đặt tên và sử dụng chúng: truy cập dữ liệu và dịch vụ của chúng.

Một số ngôn ngữ cung cấp cho bạn các hộp thống nhất, trong đó chỉ có nhãn là quan trọng, nhưng bạn có thể đặt bất cứ thứ gì vào chúng, thậm chí bạn có thể sử dụng một biến có tên "mục tiêu" để lưu trữ "Người" ở đầu và "Xe hơi" ở cuối thuật toán tương tự. Những người khác yêu cầu bạn tạo các hộp "có hình", do đó, các hộp khác nhau cho Người hoặc Xe - mặc dù họ vẫn cho phép bạn tạo "hộp chung" (Đối tượng Java, C / C ++ void *, Objective C "id" ...) và đúc nó như bạn muốn. Các ngôn ngữ được nhập cho phép bạn thể hiện cấu trúc của mình một cách chi tiết hơn, tạo ra "hợp đồng loại" cho các biến của bạn (mặc dù bạn có thể hack xung quanh giới hạn này), trong khi các ngôn ngữ chưa được hỗ trợ này tiếp cận "Tôi chắc chắn sẽ biết những gì tôi đã đưa vào hộp đó lần này" như hành vi mặc định và duy nhất.

Cả hai cách tiếp cận đều khả thi, có trí thông minh trình biên dịch, nhiều sách lập trình, thực tiễn và khung được viết bằng cách sử dụng chúng (và hàng tấn sách khác về các khung đó) ở các cấp độ khác nhau. Vì vậy, ngày nay câu trả lời dường như là vấn đề về sở thích và kiến ​​thức của đội ngũ lập trình viên thực tế hơn là một tuyên bố được đo lường và xác minh đúng đắn về việc nên sử dụng hay không sử dụng các loại.

Tôi nghĩ rằng không cần phải nói rằng tôi thích các quy tắc cho các thủ thuật, đặc biệt là đối với các dự án lớn, lâu dài (hay còn gọi là "nghiêm túc"). Lý do: theo như tôi biết, nguyên nhân rất có thể của sự thất bại / trượt dự án SW là: yêu cầu không rõ ràng và thiết kế kém (80%! Theo một nghiên cứu mà tôi biết), và chỉ còn lại vài phần trăm cho mã hóa thực tế. Tất cả các quy tắc và hợp đồng thi hành thiết kế sạch hơn, suy nghĩ về phía trước và yêu cầu các quyết định phải được đưa ra sớm hơn và bởi những người phù hợp. Các loại quy tắc có nghĩa là: ít "tự do" và "mát mẻ" - chuẩn bị nhiều hơn, suy nghĩ, tiêu chuẩn mã hóa, làm việc nhóm được kiểm soát. Đối với tôi, điều này nghe có vẻ như là một yếu tố bắt buộc của thành công và cũng là "ngôi nhà, ngôi nhà ngọt ngào".

2 xu của tôi.


-3

AFIAK tất cả các ngôn ngữ với kiểu gõ động là ngôn ngữ được giải thích. Điều đó đã rất không hiệu quả, việc thêm hiệu quả của việc gõ động sẽ không mất nhiều thời gian. Tuy nhiên, một ngôn ngữ được biên dịch sẽ không thực sự đề cập đến những thứ theo tên khi nó chạy. (Không sử dụng thỉnh thoảng sử dụng phản xạ .net hoặc tương tự - các tính năng rất chậm so với ngôn ngữ cơ bản.) Tìm kiếm tất cả các tên đó sẽ chậm, chậm, chậm.


3
Bạn biết sai rồi. Có nhiều trình biên dịch cho các ngôn ngữ được gõ động, và một số trong số chúng khá nhanh. Ví dụ bao gồm Lisp chung, Đề án và Erlang.
Ryan Culpepper

3
Không có thứ gọi là "ngôn ngữ diễn giải". Một ngôn ngữ là một tập hợp trừu tượng của các quy tắc toán học. Một ngôn ngữ không được biên dịch cũng không được giải thích. Một ngôn ngữ chỉ là. Biên soạn và giải thích là đặc điểm của việc thực hiện, không phải ngôn ngữ. Mọi ngôn ngữ có thể được thực hiện với một trình thông dịch, và mọi ngôn ngữ có thể được thực hiện với một trình biên dịch. Và hầu như mọi ngôn ngữ đều có các triển khai được biên dịch và biên dịch, ví dụ: có các trình thông dịch cho C và trình biên dịch cho ECMAScript, Ruby và Python.
Jörg W Mittag

-4

Các ngôn ngữ được gõ động thường được quảng cáo là "hướng đối tượng". Họ không phải. Chúng có thể được định hướng đóng gói, nhưng không bao giờ hướng đối tượng. Định hướng đối tượng là tất cả về các loại.

"Cậu bé cưỡi chiếc xe đạp của anh trai đến cửa hàng tạp hóa và mua một ổ bánh mì từ cửa hàng tạp hóa". Sử dụng hướng đối tượng, người ta có thể viết ngay một tập hợp các lớp (loại) để mô tả kịch bản trong thế giới thực này.

Trong một ngôn ngữ được gõ động, kịch bản chỉ có thể được trình bày như sau:

"Đối tượng cưỡi đối tượng của mình đến đối tượng và mua một đối tượng từ đối tượng".

Sức mạnh của định hướng đối tượng nằm ở khả năng mô hình hóa thế giới theo cách tự nhiên, do đó, nhà phát triển phần mềm có thể sử dụng cả hai bên não để viết phần mềm và giải quyết vấn đề nhiều hơn như một con người, ít hơn là một lập trình viên máy tính. Sức mạnh này không có trong các ngôn ngữ gõ động.

Gõ tĩnh cho phép hiệu quả mã hóa tốt hơn, khả năng sử dụng lại và khả năng bảo trì tốt hơn, bởi vì môi trường phát triển tích hợp biết các loại biến. Biết các loại biến, IDE có thể cung cấp tự động hoàn thành để lập trình viên không phải quay lại định nghĩa lớp để nhớ liệu thuộc tính thành viên được đánh vần là "backlightControl" hay "backLightControl" hoặc "bkLightCtrl".

Gõ tĩnh cho phép tái cấu trúc tự động, bởi vì IDE biết mọi nơi mà một biến chứa một thể hiện của đối tượng được tái cấu trúc.

Gõ tĩnh cho phép khả năng tái sử dụng và bảo trì lớn hơn. Gõ động là tốt hơn cho mã dùng một lần. Giả sử một nhà phát triển mới xuất hiện ngoài đường và xem xét một đoạn mã hiện có. Nếu mã được gõ tĩnh, nhà phát triển có thể, trong hai lần nhấp chuột, kiểm tra định nghĩa lớp của từng biến liên quan, biết lớp đó dùng để làm gì, biết các phương thức và thuộc tính khác có sẵn. Nếu mã được gõ động, nhà phát triển phải sử dụng tìm kiếm toàn cầu để tìm hiểu điều gì đang xảy ra.


2
Tôi sợ rằng tôi phải không đồng ý với bạn về phần đầu tiên trong cuộc tranh luận của bạn. Các ngôn ngữ được gõ động thường là "hướng đối tượng", nhưng không phải là "hướng theo lớp". Đây là một dấu hiệu đặc biệt quan trọng. Trong ví dụ của bạn, bạn thực sự đang sống trong một ảo ảnh. Bạn có thể có một Boylớp học, nhưng tôi nghi ngờ nó có thể làm mọi thứ mà một "cậu bé" trong thế giới thực làm. Tuy nhiên, trong ví dụ động của bạn (Đối tượng cưỡi ...), chúng tôi biết điều quan trọng duy nhất về đối tượng "cậu bé" này - nó có thể cưỡi . Đó là triết lý cơ bản của ngôn ngữ kiểu động. Nó có + ve s và -ve s. Cái nào bạn thích là ý kiến ​​của bạn.
Chip
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.