2011-01-31 27 views
6

Có vẻ như không có cú pháp ngôn ngữ để chỉ định cả hàm tạo này() và cơ sở(). Được cung cấp mã sau:phương thức này() và cơ sở() trong C#

public class Bar : Foo 
{ 
    public Bar() 
     :base(1) 
     //:this(0) 
    { } 
    public Bar(int schmalue) 
     :Foo(1) 
    { 
     //Gobs of initialization code 
     ... 
     Schmalue = schmalue; 
    } 

    public int Schmalue { get; private set; } 
} 

public class Foo 
{ 
    public Foo() 
    { 
     Value = 0; 
    } 

    public class Foo(int value) 
    { 
     Value = value; 
    } 

    public int Value { get; private set; } 
} 

Trình biên dịch cho tôi lỗi rằng '{' được mong đợi khi bỏ ghi chú: gọi (0) này. Điều này là khó chịu bởi vì nó làm cho tôi yếu tố ra mã của tôi thành một phương pháp riêng, khi chức năng này được cung cấp rõ ràng để ngăn chặn một điều như vậy.

Tôi chỉ làm điều này sai? Tôi đã cố gắng không có dấu phân cách, dấu chấm phẩy, dấu phẩy ... Có vẻ như đây chỉ là sự giám sát từ nhóm dev. Tôi quan tâm đến lý do tại sao điều này được bỏ qua, nếu tôi đang đi về điều này một cách sai lầm hoặc nếu ai có đề xuất tốt cho các lựa chọn thay thế.

+1

bản sao có thể có của [Gọi hàm dựng ngược và hàm tạo cơ sở trong C#] (http://stackoverflow.com/questions/335286/calling-overriden-constructor-and-base-constructor-in-c) – Oded

+2

Cảm ơn tất cả các bạn của câu trả lời. Về bản chất, vấn đề là hàm này() cũng có thể gọi một hàm tạo cơ bản khác. – Sprague

Trả lời

8

Bạn có thể thực hiện điều này bằng cách gọi các nhà xây dựng cơ sở ở phần cuối của chuỗi của bạn:

public Bar(): this(0) {} 
public Bar(int schmalue): base(1) { 
    // ... initialize 
} 
+0

Cảm ơn bạn, đây là câu trả lời. Nhiều người khác sau khi bạn đã nói những điều tương tự (một số rõ ràng hơn) nhưng điều này chắc chắn là nó. – Sprague

3

Không, bạn chỉ có thể xích vào một hàm khởi tạo đơn - hoặc là một hàm tạo khác trong cùng một lớp hoặc một hàm tạo cơ bản.

Nó không thực sự rõ ràng những gì bạn đang cố gắng làm. Thông thường tôi thấy nó có giá trị khi tạo một hàm khởi tạo "chính" trong lớp dẫn xuất: tất cả các hàm tạo khác trong lớp dẫn xuất sử dụng "this" để gọi hàm chính, gọi là "base" để gọi hàm tạo cơ sở thích hợp.

Trong khi mô hình không phù hợp mỗi kịch bản - đặc biệt là khi bạn muốn gọi nhà xây dựng cơ sở khác nhau từ nhà xây dựng có nguồn gốc khác nhau - đó là thường một mô hình tốt.

1

Trong thiết kế của bạn, tôi không thể nhìn thấy nhiều thứ thông thường giữa các lớp BarFoo. Tại sao Foo xuất phát từ Bar khi bạn thực hiện lại mọi thứ? Cả hai lớp đều có một thuộc tính số nguyên với getter công cộng và setter riêng và cả hai lớp đều có các hàm tạo mặc định và một hàm tạo cho phép khởi tạo thuộc tính số nguyên. Vậy tại sao hai lớp đó lại tồn tại?

0

Các ctor thứ hai tại Bar chỉ đơn giản là sai. Hãy thử:

public Bar(int schmalue) 
    :base(1) //would call Foo(1) 
{ 
    //Gobs of initialization code 
    ... 
    Schmalue = schmalue; 
} 

Các bình luận trong ctor đầu tiên dường như có nghĩa cái gì đó như

  • initialize Bar với schmalue = 0

  • gọi cơ sở ctor Foo với giá trị = 1

Phải không?

Để làm điều đó, hãy thay ctor thứ hai và chỉ cần thêm một (tư nhân) ctor có thể xử lý cả hai giá trị

public Bar(int schmalue) 
    :this(1, schmalue) //would call Bar(1, schmalue) 
{ 
} 

private Bar(int value, int schmalue) 
:base(value) 
{ 
    //Gobs of initialization code 
    ... 
    Schmalue = schmalue; 
} 
3

Hãy xem xét những gì sẽ xảy ra nếu bạn có thể gọi cả hai thisbase như nhà xây dựng trong một nhà xây dựng. Giả sử rằng hàm khởi tạo cơ sở đầu tiên sẽ được gọi. Sau đó, hàm tạo this sẽ được gọi - chính nó sẽ gọi hàm tạo cơ sở. Do đó, lớp cơ sở sẽ được khởi tạo hai lần. Điều này phá vỡ ngữ nghĩa của các hàm tạo - cụ thể là, một đối tượng được xây dựng một lần.

Như vậy, hãy gọi cả hai số basethis đều bị cấm. Hãy để người được ủy nhiệm this của bạn gọi cơ sở với các tham số cụ thể, nếu cần.

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