2017-09-25 19 views
5

Trong C# 7 chúng ta có thể thực hiện một phương thức Deconstruct sẽ được gọi khi gán một đối tượng cho một bộ tuple với các loại đối sánh.C# 7: Tại sao việc giải mã tuple không được thực hiện thông qua giao diện?

Tôi tự hỏi tại sao Microsoft lại quyết định thực hiện điều này như một "phương pháp ma thuật". Có phương thức được đặt tên cụ thể này không được kế thừa từ bất cứ đâu và nếu bạn đặt tên đúng và đặt các tham số chính xác, thì bạn sẽ có thể gán đối tượng này cho bộ tuple tương ứng.

Tôi sẽ tưởng tượng rằng nhóm thiết kế sẽ tạo ra một giao diện cho mục đích này.

Cái gì như:

public interface IDecontructible<T1> 
{ 
    void Deconstruct(out T1 a); 
} 

public interface IDecontructible<T1, T2> 
{ 
    void Deconstruct(out T1 a, out T2 b); 
} 

public interface IDecontructible<T1, ... ,Tn> 
{ 
    void Deconstruct(out T1 a, ... ,out Tn n); 
} 

Tất nhiên có sẽ phải có nhiều giao diện với số lượng khác nhau của tham số.

Có lý do rõ ràng nào cho lựa chọn thiết kế này không, tôi đang thiếu?

+0

FWIW ghi chú thiết kế cho bit cụ thể này [có tại đây] (https://github.com/dotnet/csharplang/blob/master/meetings/2016/LDM-2016-05-03-04.md), với các cuộc thảo luận thêm [liên kết từ trang Deconstruction chính] (https://github.com/dotnet/roslyn/blob/master/docs/features/deconstruction.md). –

+1

Suy luận về các Tên sẽ không thể thực hiện được với các giao diện. –

Trả lời

10

Bởi vì với Deconstruct cách nó được, bạn, bạn có thể quá tải nó, và nó có thể áp dụng cho bất kỳ đối tượng. Nếu đó là một giao diện, thì nhóm sẽ phải quay lại và áp dụng nó cho mọi kiểu họ muốn có khả năng có nó, và họ sẽ cần phải có những cái khác nhau cho mỗi chữ ký phương thức, điều này không khả thi. Ví dụ.

class Employee { 
    public string FirstName {get;set;} 
    public string Id {get;set;} 

    Deconstruct (out string firstName){ 
    firstName = FirstName; 
    } 

    Deconstruct (out string firstName, out string LastName){ 
    firstName = FirstName; 
    lastName = LastName; 
    } 

    Deconstruct (out int id){ 
    id = EmployeId; 
    } 
} 

Với triển khai hiện tại, bạn có thể có ba phiên bản Deconstruct. Ngoài ra, bạn có thể áp dụng phương pháp Deconstruct như một phương thức mở rộng. Những mẫu này sẽ không thể thực hiện được với một giao diện duy nhất.

+0

Bạn có một điểm tốt với các phương thức mở rộng ... Tôi nghĩ rằng bạn có thể nhận ra nhiều giao diện với các đối số khác nhau để thực hiện nhiều phương thức Deconstruct. –

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