2015-12-25 17 views
12

Chúng tôi không thể tạo đối tượng của lớp trừu tượng, nhưng chúng tôi có thể tạo Danh sách hoặc một mảng trong số đó. Sự khác biệt là gì?Sự khác biệt giữa đối tượng của lớp trừu tượng và danh sách đối tượng của lớp trừu tượng là gì?

+1

Danh sách hoặc mảng chỉ đơn giản là trình giữ chỗ cho một bộ con trỏ và bạn chưa tạo ra các bản sao của bất kỳ thứ gì. Khi bạn nói Tạo đối tượng - bạn có nghĩa là tạo một cá thể - mà bạn không thể làm với một lớp trừu tượng. Nhưng bạn có thể tạo danh sách hoặc mảng trỏ đến chúng (và là EMPTY) - sau đó bạn có thể di chuyển con trỏ đến các trường hợp 'thực' của các lớp/đối tượng có nguồn gốc – Grantly

+2

@Grantly tại sao không trả lời;) – Console

+0

Xin lỗi tôi đã có một chút nhầm lẫn lúc đó :) Cảm ơn tôi sẽ, nhưng tất cả những người khác tôi nghĩ rằng nó có bảo hiểm - và tôi chắc chắn nó sẽ nhận được downvoted lol ... Ở đây nó đi ngay bây giờ;) – Grantly

Trả lời

15

Danh sách hoặc mảng chỉ đơn giản là trình giữ chỗ cho một bộ con trỏ và bạn chưa tạo ra các phiên bản của bất kỳ thứ gì.

Khi bạn nói Tạo đối tượng - bạn có nghĩa là tạo một cá thể - bạn không thể làm gì với lớp trừu tượng.

Nhưng bạn có thể tạo danh sách hoặc Mảng trỏ đến họ (và là EMPTY) - sau đó bạn có thể di chuyển con trỏ đến trường 'thật' của các lớp thừa/đối tượng

+2

"và bạn chưa tạo bất kỳ trường hợp nào." - ngoại trừ danh sách hoặc mảng; chính nó là một thể hiện của danh sách hoặc mảng. –

+0

@TJamesBoone bạn hoàn toàn chính xác, nhưng tôi không muốn gây nhầm lẫn hoặc làm phức tạp vấn đề. Câu trả lời của tôi không phải là rất toàn diện - và thiếu những chi tiết mà những người khác cung cấp - nhưng tôi hy vọng câu trả lời phù hợp với câu hỏi ngắn gọn của câu hỏi – Grantly

0

Không, bạn không thể tạo một mảng "của chúng", bởi vì bạn không thể đặt các loại trừu tượng vào danh sách. Một danh sách của một kiểu trừu tượng chứa bất kỳ các thể hiện có nguồn gốc nào của kiểu trừu tượng.

Chỉ nghĩa là bất kỳ loại có nguồn gốc của các loại trừu tượng có thể trong danh sách

+2

Tôi nghĩ rằng người dùng có nghĩa là danh sách được khai báo là danh sách với các thành viên của lớp trừu tượng. Điều này chắc chắn là có thể. –

+1

chắc chắn rằng có thể, nhưng ông đặt "của họ" và bạn không thể đặt trong trường hợp trừu tượng của đối tượng –

+0

Tôi hiểu quan điểm của bạn. –

2

Các List rỗng!

Điều đó có nghĩa là không có trường hợp nào của lớp abstract.

Tạo danh sách trống được cho phép. Bạn có thể (sau này) thêm vào nó một lớp học non abstract mở rộng nó.

6

Có thể khai báo và khởi tạo một danh sách trong đó kiểu của các thành viên là một lớp trừu tượng bởi vì để tạo ra đối tượng này, bạn không cần thực sự khởi tạo lớp trừu tượng.

Về mặt logic, danh sách này chỉ là vùng chứa cho con trỏ.

Ví dụ: bạn có thể xác định danh sách lớp trừu tượng, nhưng danh sách này có thể ở đầu trống.

Bạn cũng có thể khởi tạo danh sách với kích thước ban đầu, nhưng khi bắt đầu nó sẽ không chứa tham chiếu đến đối tượng thực tế: khởi tạo sẽ chỉ phân bổ không gian cho con trỏ.

Các đối tượng được thêm vào danh sách phải là trường hợp của một lớp cụ thể mở rộng lớp trừu tượng.

8

Tóm tắt các trả lời:

danh sách hoặc các mảng chính nó không phải là một lớp trừu tượng, ngay cả khi loại nó tuyên bố nó sẽ giữ một lớp trừu tượng.

More Chi tiết Trả lời:

Mặc dù bạn không thể làm cho một đối tượng của một lớp trừu tượng (từ "của" là hơi mơ hồ, nhưng rõ ràng là bạn có ý nghĩa như một instantiation trực tiếp của lớp đó), bạn có thể tạo một đối tượng là một thể hiện của lớp trừu tượng (vì đó là một thể hiện của một lớp cụ thể mở rộng lớp trừu tượng).

Về cơ bản, được đưa ra abstract class Abstraction, và lớp bê tông Concrete kéo dài Abstraction, List<Abstraction> có nghĩa là bạn có thể nhưng bất cứ điều gì trong đó mà là một thể hiện của một cái gì đó mà kéo dài Abstraction, ví dụ một thể hiện của Concrete. Mặc dù mảng là một chút khác nhau trong một số cách từ danh sách, cũng vậy cho họ là tốt.

Ví dụ:

Với lớp này:

public abstract class Abstraction { 

} 

Và lớp này:

public class Concrete : Abstraction { 

} 

Bạn không thể làm điều này:

Abstraction a = new Abstraction(); 

nhưng bạn có thể làm điều này:

Abstraction a = new Concrete(); 

Và sau đó bạn có thể làm điều này:

IList<Abstraction> list = new List(); 
list.add(a); 
+1

Bạn có thể có nghĩa là 'public class Concrete: Abstraction', Lưu ý dấu hai chấm,' extends' là Java. – Kroltan

+1

Rất tiếc, bạn đã đúng. Nó đã được một thời gian kể từ khi tôi đã được trong C#, đã làm rất nhiều Java trong vài năm qua. –

2

Tôi tin rằng u chỉ đơn giản là mạnh mẽ gõ những gì các đối tượng bên trong mảng sẽ

Vì vậy, khi nó đến thời gian để đưa các đối tượng đã được khởi tạo vào mảng. Nó phải là một đối tượng mà đã được mở rộng từ lớp trừu tượng

3

Bạn không thể tạo một thể hiện của một lớp trừu tượng cho obvious reasons nhưng chắc chắn tạo ra một thể hiện của lớp List<T> được phép phân biệt rằng T là một lớp trừu tượng .

Để lớp trừu tượng được gọi là ClassAbstract.

  • Khi bạn cố gắng làm - new ClassAbstract(), bạn thử để tạo ra một đối tượng của ClassAbstract.
  • Khi bạn làm - new List<ClassAbstract>(), bạn tạo đối tượng của lớp List<T>.
2

Không có kỳ lân màu hồng kỳ diệu nào.

Nhưng bạn vẫn có thể xây dựng một ổn định cho kỳ lân màu hồng kỳ diệu, bạn chỉ sẽ không bao giờ có thể đặt bất kỳ trong đó, bởi vì không có bất kỳ.

Tương tự thực tế hơn: bạn không thể đến cửa hàng thú cưng và mua "động vật có vú". Đó là quá trừu tượng một điều.

Nhưng, bạn có thể xây dựng chuồng ngựa ổn định cho động vật có vú. Và sau đó bạn có thể mua ngựa, bò, chó, mèo, voi, hươu cao cổ, chó sói, báo, và sư tử và đặt chúng vào đó. Có lẽ ngay cả kỳ lân màu hồng kỳ diệu, nếu bạn có thể tìm thấy bất kỳ.

(Làm thế nào để xây dựng một ổn định có thể cùng một lúc chứa con chuột và cá voi bướu là trái như một bài tập cho người đọc.)

+0

Khi tôi đọc dòng đầu tiên của câu trả lời của bạn, tôi nghĩ rằng tôi đã nhấp vào một số câu hỏi khác và đã đọc câu trả lời cho điều đó. Sau đó, tôi đã kiểm tra nếu tôi có câu hỏi đúng. Và sau đó tôi hiểu quan điểm của bạn. : D – displayName

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