Tôi ngạc nhiên rằng dường như có sự đồng thuận ở đây rằng không ảo theo mặc định là cách đúng đắn để thực hiện mọi việc. Tôi sẽ đi xuống phía bên kia - tôi nghĩ thực dụng - bên hàng rào.
Hầu hết những lời biện minh đọc cho tôi nghe đều giống như lập luận cũ "Nếu chúng tôi cho bạn sức mạnh, bạn có thể tự làm hại chính mình". Từ các lập trình viên ?!
Đối với tôi, có vẻ như người lập trình viên không biết đủ (hoặc có đủ thời gian) để thiết kế thư viện của họ để kế thừa và / hoặc khả năng mở rộng là người lập trình đã tạo ra chính xác thư viện mà tôi có thể phải sửa hoặc chỉnh sửa - chính xác là thư viện nơi khả năng ghi đè sẽ hữu ích nhất.
Số lần tôi phải viết mã công việc tồi tệ, tuyệt vọng (hoặc từ bỏ việc sử dụng và đưa ra giải pháp thay thế của riêng mình) vì tôi không thể ghi đè lên, nhiều hơn nhiều lần tôi từng bị cắn ( ví dụ như trong Java) bằng cách ghi đè lên nơi mà nhà thiết kế có thể không xem xét tôi có thể.
Không-ảo-theo-mặc-định khiến cuộc sống của tôi vất vả hơn.
CẬP NHẬT: Đã chỉ ra [khá chính xác] rằng tôi đã không thực sự trả lời câu hỏi. Vì vậy - và với lời xin lỗi vì đã khá muộn ....
Tôi muốn có thể viết một cái gì đó thú vị như "C # thực hiện các phương thức không phải là ảo theo mặc định vì một quyết định tồi đã được đưa ra khiến chương trình đánh giá cao hơn lập trình viên". (Tôi nghĩ rằng điều đó có thể được chứng minh phần nào dựa trên một số câu trả lời khác cho câu hỏi này - như hiệu suất (tối ưu hóa sớm, có ai không?) Hoặc đảm bảo hành vi của các lớp.)
Tuy nhiên, tôi nhận ra rằng tôi chỉ đang nêu ý kiến của mình chứ không phải câu trả lời dứt khoát mà Stack Overflow mong muốn. Chắc chắn, tôi nghĩ, ở cấp độ cao nhất, câu trả lời dứt khoát (nhưng vô ích) là:
Theo mặc định, chúng không phải là ảo bởi vì các nhà thiết kế ngôn ngữ đã đưa ra quyết định và đó là những gì họ đã chọn.
Bây giờ tôi đoán lý do chính xác mà họ đưa ra quyết định đó, chúng tôi sẽ không bao giờ .... ồ, chờ đã! Bản ghi của một cuộc trò chuyện!
Vì vậy, có vẻ như các câu trả lời và nhận xét ở đây về sự nguy hiểm của việc ghi đè API và nhu cầu thiết kế rõ ràng để kế thừa đang đi đúng hướng nhưng tất cả đều thiếu một khía cạnh quan trọng về thời gian: Mối quan tâm chính của Anders là về việc duy trì ngầm định của một lớp hoặc API hợp đồng giữa các phiên bản . Và tôi nghĩ rằng anh ấy thực sự quan tâm hơn đến việc cho phép nền tảng .Net / C # thay đổi theo mã hơn là quan tâm đến việc thay đổi mã người dùng trên nền tảng. (Và quan điểm "thực dụng" của anh ấy hoàn toàn trái ngược với tôi vì anh ấy đang nhìn từ phía khác.)
(Nhưng không thể họ chỉ chọn ảo theo mặc định và sau đó xếp "cuối cùng" thông qua cơ sở mã? Có lẽ điều đó không hoàn toàn giống nhau .. và Anders rõ ràng là thông minh hơn tôi nên tôi sẽ để nó nói dối.)
this
tham chiếu là null. Xem ở đây để biết thêm thông tin.