2012-01-04 44 views
9

Tôi muốn gọi constructor trong lớp như: public class MyClass() {Làm thế nào để gọi hàm tạo bên trong lớp?

public MyClass(){ 
     //...... 
    } 

    public MyClass(int id):this(){ 
     //...... 
    } 

    private void Reset(){ 
     //..... 
     this = new MyClass(id); //here I want to call constructor 
     //...... 
    } 
} 

nhưng nó không được làm việc. Có thể và làm thế nào tôi có thể làm điều đó nếu có?

+2

Tại sao bạn muốn làm điều đó? Bạn không thể thay đổi con trỏ 'this' theo cách này bên trong một phương thức instance, cũng như bạn không muốn. –

Trả lời

10

Bạn không thể. Nhưng những gì bạn có thể làm là tách logic của hàm tạo thành một phương thức khởi tạo mà sau đó thiết lập lại có thể gọi.

public MyClass(){ 
    //...... 
    } 

    public MyClass(int id):this(){ 
     Initialize(id); 
    } 

    private void Initialize(int id){ 
    //.... 
    } 

    private void Reset(){ 
     //..... 
     Initialize(id); 
     //...... 
    } 
} 
3

Không thể thực hiện điều này. Bạn không thể gán cho điều này.

Bạn tuy nhiên có thể cho phép Reset() trở lại một trường hợp mới của MyClass để mã người gọi có thể nói:

public class MyClass 
{ 
    public MyClass Reset() 
    { 
     return new MyClass(); 
    } 
} 

MyClass c = new MyClass(); 
c = c.Reset(); 

Hoặc bạn có thể thực hiện phương pháp Reset theo cách như vậy tất cả các trường được reinitialized để giá trị mặc định của họ.

+0

Tôi thích ý tưởng Reset() trả về một thể hiện mới, trong trường hợp đó có thể là 'static'. –

+2

Nếu một phiên bản mới được trả lại, nó không còn Đặt lại bất kỳ thứ gì. Nó trở lại một thể hiện mới được tạo ra của lớp. Loại gây hiểu nhầm. –

+0

Đúng, có lẽ 'Tạo()' sẽ là một tên phương thức tốt hơn. –

14

Câu trả lời đơn giản: Bạn không thể.

câu trả lời Hơi phức tạp hơn: Di chuyển lôgic khởi của bạn thành một phương pháp riêng biệt mà có thể được gọi từ các nhà xây dựng và Reset() phương pháp của bạn:

public class MyClass 
{ 
    public int? Id { get; } 

    public MyClass() 
    { 
     Initialize(); 
    } 

    public MyClass(int id) 
    { 
     Initialize(id); 
    } 

    public Reset() 
    { 
     Initialize(); 
    } 

    private Initialize(int? id = null) 
    { 
     // initialize values here instead of the constructor 
     Id = id; 
    } 
} 
+1

Điều này hoàn toàn ngắn gọn và rõ ràng và giúp tôi hiểu biết rất nhiều. – secretwep

2

Bạn thể gọi một constructor cho lớp học của bạn bên trong lớp học của bạn (trên thực tế, điều này thường được thực hiện với phương pháp nhà máy):

public class MyClass 
{ 
    public static MyClass Create() 
    { 
     return new MyClass(); 
    } 
} 

Nhưng bạn không thể thay đổi giá trị của tham chiếu this bên trong lớp học. Thay vào đó, bạn nên đặt phương thức "Reset()" của bạn đặt các trường trở về giá trị mặc định của chúng.

1

Trong một lớp học mà bạn không thể gán this (mặc dù nó đáng chú ý là trong một cấu trúc đó là hoàn toàn hợp pháp). Câu hỏi, mặc dù, là liệu bạn nên. Tôi giả định rằng mục tiêu của bạn là đặt tất cả các giá trị trường thành một trạng thái cụ thể, vì vậy khi những người khác đã nói bạn có thể đặt lại phương thức Đặt lại phiên bản mới hoặc bạn có thể tách logic của mình thành phương thức Clear() và gọi thay thế.

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