2009-09-05 41 views
11

Tôi không thể tìm ra cách sử dụng cho this code. Những gì sử dụng là mô hình này?Mã sử ​​dụng này là gì?

[mã lặp đi lặp lại ở đây cho hậu thế]

public class Turtle<T> where T : Turtle<T> 
{ 
} 
+13

Rùa của nó tất cả các con đường ... – Juliet

+0

Wha !? Tôi phải thiếu một cái gì đó ... –

+4

Cần thêm rùa, nếu bạn hỏi tôi. – Corey

Trả lời

9

Mẫu này về cơ bản cho phép bạn tham chiếu một lớp con cụ thể trong lớp cha. Ví dụ:

public abstract class Turtle<T> where T : Turtle<T> 
{ 
    public abstract T Procreate(); 
} 

public class SeaTurtle : Turtle<SeaTurtle> 
{ 
    public override SeaTurtle Procreate() 
    { 
     // ... 
    } 
} 

Versus:

public abstract class Turtle 
{ 
    public abstract Turtle Procreate(); 
} 

public class SnappingTurtle : Turtle 
{ 
    public override Turtle Procreate() 
    { 
     // ... 
    } 
} 

Trong cựu, nó xác định rằng một SeaTurtle 's bé sẽ là một SeaTurtle.

+0

Bạn có nghĩ rằng, loại điều này sẽ không được yêu cầu, nếu có hỗ trợ cho phương sai? – shahkalpesh

+1

Nó có nhiều công dụng hơn. Nó có thể thực hiện các giao diện cho lớp con. Giống như, trong Java, 'java.lang.Enum' sử dụng mẫu để thực hiện' java.lang.Comparable' cho lớp con. Tôi chắc chắn C# có một cái gì đó tương tự. –

+0

Chắc chắn có các cách sử dụng khác, nhưng tất cả chúng đều liên quan đến lớp cha cần sử dụng loại phân lớp của nó. Về việc triển khai giao diện, bạn có hai lựa chọn: triển khai giao diện cho T hoặc Turtle . IComparable sẽ chỉ cho phép bạn so sánh các mục của cùng một phân lớp, trong đó IComparable > sẽ cho phép bạn so sánh bất kỳ Rùa nào. Và kể từ khi .NET 4.0 của IComparable sẽ là contravariant trong T, bạn sẽ có thể sử dụng IComparable > dưới dạng IComparable vì T: Turtle . – dahlbyk

-1

Không có sử dụng mà tôi có thể nhìn thấy. Về cơ bản, nó giống như

public class Turtle 
{ 
} 
+1

Nó không giống nhau vì trong đoạn mã đã cho, 'Rùa' không thể được khởi tạo. – strager

+1

Có thể ... xem nhận xét của Marc Gravell tại đây http://stackoverflow.com/questions/194484/whats-the-strangest-corner-case-youve-seen-in-c-or-net/1332344#1332344 –

+0

@Levesque, Và xem bình luận của RCIX sau. – strager

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