Tôi có một câu hỏi mà tôi không tìm thấy câu trả lời. Hãy nói rằng chúng tôi có trong hoặc java hay C# đoạn mã sau:Java tăng cường cho vòng lặp VS .NET foreach loop
class Car {
/* car stuff */
}
Và sau đó trong Java
class Truck extends Car {
/* truck stuff */
}
và C#
class Truck : Car {
/* truck stuff again */
}
Trong C# các công việc sau tốt:
List<Car> carList = new List<Car>();
//add some objects to the collection
foreach(Truck t in carList)
//do stuff with only the Truck objects in the carList collection
Điều này có tác dụng vì Xe tải là một phân lớp của Xe, trong điều kiện đơn giản có nghĩa là mỗi Xe tải cũng là Xe hơi. Điều này là mặc dù, kiểm tra loại được thực hiện và chỉ có xe tải được chọn từ carList.
Nếu chúng ta cố gắng điều tương tự trong Java:
List<Car> carList = new ArrayList<Car>();
//add some objects to the collection
for(Truck t : carList)
//**PROBLEM**
Bởi vì các mã bên trong vòng lặp nâng cao, mã thậm chí sẽ không biên dịch. Thay vào đó chúng ta phải làm một cái gì đó như thế này để có được những tác dụng tương tự:
for(Car t : carList)
if(t instanceof Car)
//cast t to Truck and do truck stuff with it
Đây là ý tưởng tương tự mà trong C# hoạt động mà không có vấn đề gì, nhưng trong Java bạn cần thêm mã. Ngay cả cú pháp gần như giống nhau! Có lý do nào khiến nó không hoạt động trong Java không?
này cũng không phải là quá sạch bằng C# vì mỗi xe tải là một xe nhưng không phải mọi xe là một xe tải ... Trong C# chuyển đổi được cố gắng trong thời gian chạy, nhưng bạn nên thực sự thận trọng với nó. Java dường như thận trọng hơn về nó và muốn các lập trình viên kiểm tra nó trước tiên (tất nhiên phiên bản C# có thêm một số lợi ích nếu bạn biết những gì bạn đang làm). –
trong C# loại của từng đối tượng được chọn. Nếu nó là Xe tải, cơ thể của vòng lặp foreach được nhập vào, nếu không nó sẽ không. Điều gì không sạch về điều đó?Hoặc tôi kiểm tra nó (Java) hoặc thời gian chạy kiểm tra nó (C#) nó 's cùng một kết quả cuối cùng. – alegen
@alegen, điều đó không đúng. –