2012-06-30 22 views
24

Có thể ghi đè lên hàm tạo của lớp cơ sở trong lớp dẫn xuất không?Có thể ghi đè lên một hàm tạo trong C# không?

Nếu có, làm cách nào để hoàn thành và trong trường hợp sử dụng nào sẽ thực tế? Nếu không, tai sao không?

+1

Kính gửi chuyên gia mã hóa đến từ logic tôi chỉ yêu cầu các resion – naval

+4

Những người khác đã trả lời tốt. Trong trường hợp bạn không biết cú pháp của các nhà xây dựng "chainig", nó giống như vậy: 'myClass nội bộ (tên chuỗi): base (null, 0, name) {...}'. Trong ví dụ này, hàm tạo gọi một hàm tạo cơ bản với ba tham số. –

+0

Mở lại cử tri: vui lòng [sửa] câu hỏi theo các tiêu chuẩn thông thường trước khi bỏ phiếu để mở lại. –

Trả lời

43

Không, bạn không thể ghi đè các nhà thầu. Khái niệm này không có ý nghĩa trong C#, bởi vì các hàm tạo đơn giản không được gọi đa hình. Bạn luôn nêu rõ lớp bạn đang cố gắng xây dựng, và các đối số cho hàm tạo.

Các nhà xây dựng không được kế thừa chút nào - nhưng tất cả các nhà xây dựng từ một lớp dẫn xuất phải liên kết với một hàm dựng khác trong cùng một lớp hoặc tới một trong các hàm tạo trong lớp cơ sở. Nếu bạn không làm điều này một cách rõ ràng, trình biên dịch ngầm chuỗi đến constructor parameterless của lớp cơ sở (và một lỗi xảy ra nếu constructor đó không tồn tại hoặc không thể truy cập được).

+4

"Khái niệm không có ý nghĩa, thực sự - các nhà xây dựng đơn giản không được gọi đa hình." - trong Delphi, họ đang có. Đó là một tính năng rất hữu ích và tôi tìm thấy các giải pháp cần thiết trong C#, hoặc bằng cách sử dụng sự phản chiếu và truyền xung quanh các cá thể 'Type' được kiểm tra thời gian chạy, hoặc bằng cách cung cấp các lớp nhà máy riêng biệt, khá cồng kềnh. –

+3

@ O.R.Mapper: Vâng vâng, tôi đang nói trong ngữ cảnh của C#. Những gì các ngôn ngữ khác làm là không liên quan đến câu trả lời này. –

+3

Trong trường hợp đó, tôi đề nghị câu trả lời không tuyên bố "khái niệm này không có ý nghĩa, thực sự", vì âm thanh đó khá chung chung. Một cái gì đó như "Khái niệm sẽ có ý nghĩa rất nhiều, nhưng nó không thể sử dụng khái niệm trong C#, vì các nhà xây dựng không được triệu tập đa hình ở đó." có thể rõ ràng hơn. –

10

Không, Constructors không được kế thừa. Bạn không thể ghi đè chúng trong lớp dẫn xuất.
Lý do

Một constructor cơ sở sẽ luôn luôn được gọi là, cho mỗi lớp xuống từ đối tượng, vì mỗi lớp phải có ít nhất một constructor mà các cuộc gọi cơ sở() constructor (rõ ràng hoặc ngầm) và mọi lời gọi đến một hàm tạo() này cuối cùng phải là gọi hàm tạo cơ sở().

+0

Được bình chọn cho một lời giải thích phù hợp và tốt !! – KillABug

6

Không, bạn không thể ghi đè lên hàm tạo.

Nếu bạn xem cú pháp cơ bản của hàm tạo, nó phải có cùng tên với lớp bạn đang viết. Cho phép nói, bạn viết một phương thức có cùng tên với lớp cơ sở (giống như của hàm tạo lớp cơ sở), nó sẽ là một phương thức mới trong lớp dẫn xuất mà không có kiểu trả về được chỉ định, đó là cú pháp sai.

+0

Được bình chọn cho một lời giải thích đơn giản. !! – KillABug

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