Ngôn ngữ lập trình hướng đối tượng, ví dụ: java, C#, ... hỗ trợ đối tượng typecasting. Ví dụ này là hoàn toàn hợp lệ trong java:Đối tượng có thực hành tốt không?
URL url = new URL("url");
URLConnection conn = url.openConnection();
if(!conn instanceof HttpURLConnection)
throw new Exception("not http request");
HttpURLConnection con = (HttpURLConnection) conn;
Hoặc một ví dụ khác cơ bản mà tôi đã cố gắng:
public class Base
{
public void base(){}
}
public class Derived extends Base
{
public void derived(){}
}
Base b = new Derived();
b.base();
nguồn gốc lớp có tất cả các lớp phương pháp cơ sở có, cộng thêm. Không có lý do tại sao bạn không thể tạo lớp cơ sở bằng cách gọi hàm tạo lớp dẫn xuất.
Tôi cũng đã xem liên kết này http://www.volantec.biz/castingObjects.htm giải thích cách thức hoạt động của đối tượng typecasting nội bộ. Cho đến nay, ok.
Nhưng tại sao ví dụ đầu tiên không sử dụng HttpURLConnection con = new HttpURLConnection("url address")
(Tôi biết HttpURLConnection là một lớp trừu tượng). Nó chỉ có vẻ rõ ràng hơn, đơn giản hơn. Mặt khác, khi bạn đang giao dịch với interfaces, object typecasting comes in handy. Một ví dụ khác là danh sách List<Object>
, đôi khi tôi thấy trong một số lớp. Nó có nghĩa là bạn có thể lưu mọi lớp có thể trong danh sách này. Sau đó bạn chỉ có thể truyền nó đến bản gốc, nếu bạn biết nó là loại gì. Sẽ không rõ ràng hơn khi chỉ lưu các lớp cụ thể vào danh sách tức là List<String>
, List<MyClass>
. Có sử dụng List<Object>
thực hành thiết kế hay không?
Bắt buộc truyền tới 'HttpURLConnection' là ví dụ hoàn hảo về OOD xấu. Về các danh sách chung: nó phụ thuộc, nhưng tôi thà đi cho các danh sách được tham số hóa càng nhiều càng tốt, vì vậy tôi có thể bắt được rất nhiều loại ngoại lệ kiểu thời gian chạy lúc biên dịch. –
Vâng, câu trả lời là trong câu hỏi: HttpUrlConnection là một lớp trừu tượng, vì vậy bạn không thể tạo một thể hiện của HttpUrlConnection. Chỉ có một lớp con. Và đó là những gì url.openConnection() làm. –
@JBNizet Tôi đã đề cập rằng trong ngoặc đơn. Tôi biết rằng HttpURLConnection là một lớp trừu tượng, do đó bạn không thể tạo một cá thể giống như bạn đã đề cập. Bạn nói đúng, tôi chỉ muốn chứng minh điều đó, có thể một số ví dụ khác là phù hợp hơn. – broadband