2009-06-12 4 views
170

Tôi có thể gọi một hàm tạo quá tải từ một hàm tạo khác của cùng một lớp trong C# không?Tôi có thể gọi một hàm tạo quá tải từ một hàm tạo khác của cùng một lớp trong C# không?

+0

ngôn ngữ gì? ... –

+0

@Mayay: Bạn đang nói về ngôn ngữ nào? Nếu bạn đang nói về java/C#, tại sao điều này lại là một câu hỏi? Tài liệu sẽ giúp bạn trước khi bạn đăng câu hỏi. Xin lỗi, nếu tôi hiểu sai. – shahkalpesh

+0

C# .. Tôi có thể gọi constructor thứ hai như foo này (args) cơ sở() nhưng là nó có thể làm như foo() này { // do something foo (args) // do something } –

Trả lời

32

EDIT: Theo nhận xét trên bài đăng gốc, đây là câu hỏi C#.

Câu trả lời ngắn gọn: có, sử dụng từ khóa this.

Câu trả lời dài: có, sử dụng từ khóa this và đây là ví dụ.

class MyClass 
{ 
    private object someData; 

    public MyClass(object data) 
    { 
     this.someData = data; 
    } 

    public MyClass() : this(new object()) 
    { 
     // Calls the previous constructor with a new object, 
     // setting someData to that object 
    } 
} 
+1

câu hỏi đã không được về vấn đề này, câu hỏi được hỏi nếu bạn có thể làm MyClass công cộng này() { // do something // sau đó chúng ta hãy gọi một constructor này (đối tượng mới()); /// bạn không thể làm điều này! } – mfawzymkh

+0

cảm ơn mfaawymkh ... vì vậy tôi không thể làm điều đó. –

+0

Ah ha, tôi hiểu rồi. Yeah, không thể làm được. –

207

Không, bạn không thể làm điều đó, nơi duy nhất bạn có thể gọi hàm tạo từ một hàm tạo khác trong C# ngay sau ":" sau hàm tạo. ví dụ:

class foo 
{ 
    public foo(){} 
    public foo(string s) { } 
    public foo (string s1, string s2) : this(s1) {....} 

} 
4

Trong C# không thể gọi một hàm tạo khác từ bên trong thân phương thức. Bạn có thể gọi hàm tạo cơ sở theo cách này: foo (args): base() như đã chỉ ra chính bạn. Bạn cũng có thể gọi một hàm tạo khác trong cùng một lớp: foo (args): this().

Khi bạn muốn làm điều gì đó trước khi gọi một hàm tạo cơ sở, có vẻ như việc xây dựng cơ sở là lớp phụ thuộc vào một số thứ bên ngoài. Nếu vậy, bạn nên thông qua các đối số của hàm tạo cơ sở, không phải bằng cách thiết lập các thuộc tính của lớp cơ sở hoặc một cái gì đó như thế

71

Nếu bạn có nghĩa là bạn có thể thực hiện chuỗi ctor trong C#, câu trả lời là có. The question đã được yêu cầu.

Tuy nhiên có vẻ như từ các ý kiến, có vẻ như những gì bạn thực sự có ý định hỏi là 'Tôi có thể gọi một constructor quá tải từ trong khác constructor với trước/sau xử lý?'
Mặc dù C# không có cú pháp để làm điều này, bạn có thể làm điều này với một hàm khởi tạo thông thường (như bạn sẽ làm gì trong C++ mà không hỗ trợ ctor chaining)

class A 
{ 
    //ctor chaining 
    public A():this(0) 
    { Console.WriteLine("default ctor"); } 

    public A(int i) 
    { Init(i); } 

    // what you want 
    public A(string s) 
    { 
    Console.WriteLine("string ctor overload"); 
    Console.WriteLine("pre-processing"); 
    Init(Int32.Parse(s)); 
    Console.WriteLine("post-processing"); 
    } 

    private void Init(int i) 
    { 
    Console.WriteLine("int ctor {0}", i); 
    } 
} 
+0

Điều này có lẽ là câu trả lời được chấp nhận. – Panzercrisis