2010-03-31 35 views
8

Tôi có một cấu trúc lớp nhưTại sao hàm tạo cơ sở() không cần thiết?

abstract class Animal { 
    public Animal(){ 
    //init stuff.. 
    } 
} 

class Cat : Animal { 
    public Cat(bool is_keyboard) : base() //NOTE here 
    { 
    //other init stuff 
    } 
} 

Bây giờ sau đó, nhìn vào dòng ghi nhận. Nếu bạn xóa : base() thì nó sẽ biên dịch mà không có lỗi.

Tại sao điều này? Có cách nào để vô hiệu hóa hành vi này không?

Trả lời

7

Có ẩn số : base() nếu bạn không thêm bất kỳ thứ gì khác (bất kỳ số nào : base(...) hoặc : this(...)). Để buộc nó phải rõ ràng, hãy thêm một tham số vào (các) hàm tạo cơ bản. Thế thì nó không thể ngầm được.

Ví dụ:

public Animal(string name) {...} 
+1

Cool, bạn học một cái gì đó hàng ngày ... Tôi đã luôn đặt một cách rõ ràng cơ sở(), có lẽ sẽ tiếp tục làm như vậy bởi vì có bao nhiêu nhà phát triển nhận ra có là một cuộc gọi ngầm đến nó? – slugster

+0

Ngoài ra, tôi tìm thấy bài viết tiện lợi của Skeet đã kể cho tôi tất cả về nó: http://www.yoda.arachsys.com/csharp/constructors.html – Earlz

+0

@slugster, tôi đã không nhận ra nó ... vì vậy yea. – Earlz

0

Tại sao điều này?

Điều này article giải thích.

Có cách nào để tắt hành vi này không?

Không. Tôi xin lỗi (nhưng ... Xem câu trả lời đánh dấu cho một workaround:)

1

17.10.4 Default Constructors:

Nếu một lớp không chứa khai báo constructor dụ , một mặc định dụ nhà xây dựng là tự động cung cấp. 2 Hàm khởi tạo mặc định đơn giản gọi hàm tạo không tham số của lớp cơ sở trực tiếp. 3 Nếu lớp cơ sở trực tiếp không có thể truy cập trình tạo cá thể không tham số có thể truy cập, xảy ra lỗi biên dịch . 4 Nếu lớp học là tóm tắt thì quyền truy cập được khai báo cho hàm tạo mặc định được bảo vệ. 5 Nếu không, khả năng tiếp cận công bố cho các nhà xây dựng mặc định là công

+1

Trong khi đúng, đó là phần sai cho những gì xảy ra khi ': base()' bị loại bỏ. Phần đó cho biết điều gì sẽ xảy ra nếu toàn bộ hàm tạo được loại bỏ. –

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