2010-04-09 33 views
11

Tôi đang viết một vài lớp mà tất cả đều có đối số kiểu chung, nhưng tôi cần phải quá tải các lớp vì tôi cần một số đối số khác nhau trong các kịch bản khác nhau. Về cơ bản, tôi cóTôi nên đặt tên tệp của mình với định nghĩa lớp chung?

public class MyGenericClass<T> { ... } 
public class MyGenericClass<T, K> { ... } 
public class MyGenericClass<T, K, L> { ... } 
// it could go on forever, but it won't... 

Tôi muốn tất cả chúng trong cùng một không gian tên nhưng trong một tệp nguồn cho mỗi lớp. Tôi nên đặt tên tệp là gì? Có cách nào tốt nhất không?

+2

Tôi không nghĩ rằng nó thậm chí còn có thể tạo ra các lớp học khác nhau có cùng tên nhưng một số khác nhau của các đối số chung. EDIT: oops, đây là C#, không phải Java. Tôi nghi ngờ bạn có thể làm điều này trong Java, vì cách hài hước nó có để xử lý các lớp học chung chung. –

+0

Microsoft có thực hiện điều này với lớp 'Tuple' trong 4.0 không? –

+0

Xem, ví dụ, tuple - Đại diện cho một tuple kích thước 1 tuple - Đại diện cho một tuple kích thước 2 tuple - Đại diện cho một tuple chân dung cỡ 3 – JasonTrue

Trả lời

9

người mà tôi đã nhìn thấy sử dụng

MyGenericClass`1, MyGenericClass`2 or MyGenericClass`3 

(số là số Generic Parameters).

Tôi nghĩ đó là những gì bạn nhận được như một TypeName khi bạn gọi. ToString trên lớp.

+1

Tài liệu XML cũng sử dụng điều này, và định nghĩa IOC –

+3

Đối số '.ToString()' là tốt nhất mà tôi đã thấy trong các cuộc thảo luận về điều này cho đến nay. Trừ khi một cái gì đó làm sáng tỏ trong ngày hôm sau hay như vậy, đây có lẽ là những gì tôi sẽ làm. –

+0

Đồng ý. Đây là những gì đi kèm trong các kết quả bảo hiểm mã là tốt. –

1

Tôi nghĩ bạn sẽ không tìm thấy nhiều giáo điều trong cộng đồng C# ưu tiên các tệp riêng biệt cho mỗi biến thể của một lớp chung chung có cùng tên; Tôi thích chỉ sử dụng một cho trường hợp bạn mô tả, mặc dù tôi có thể thấy một trường hợp cho những gì bạn đang đề xuất nếu mã là nhất thiết phải phức tạp/dài cho mỗi biến thể. Nói chung tôi chỉ sử dụng tên của lớp được đề cập dưới dạng tên tệp.

Nếu tôi định tách các biến thể thành các tệp riêng biệt, tôi có thể thấy bằng cách sử dụng giải pháp của Michael, mặc dù điều đó sẽ gây đau cho những người dùng công cụ kiểu Unix trên dòng lệnh, ví dụ: Cygwin hoặc AndLinux. Tôi có thể sử dụng dấu gạch dưới hoặc không có dấu chấm câu. Hoặc một cái gì đó như 1P, 2P, 3P như hậu tố.

1

Tôi sẽ đặt tất cả trong cùng một tệp trừ khi chúng lớn (thường chúng sẽ không xuất hiện, ngoại trừ số có nhiều nhất là Ts). Không có thực sự là một thực hành tốt nhất để đặt tên các lớp bên cạnh những gì bạn tìm thấy trong các nguyên tắc của .NET framework, vì nó là một phần của mặt lập trình sáng tạo, và tiếc là SSCLI chỉ quay lại 2.0 để bạn không thể tìm thấy nhiều sự giúp đỡ ở đó.

1

Tôi thường sử dụng Classname.1.cs, Classname.2.cs, vv ... nơi mà các số là số lập luận chung chung, tương tự như ' `1 notation used in the framework documentation (and in XML documentation in your sourcecode). Sometimes you also have a class with no generic arguments (similar to ICollection and ICollection` trong khuôn khổ), và tên file sẽ chỉ tên lớp , như mong đợi. Ngược lại với việc sử dụng backtick, điều này có lợi thế là bạn sẽ không có bất kỳ ký tự không hợp lệ nào trong tên tệp. Không phải tất cả các hệ thống tệp, hệ thống phiên bản, hệ điều hành đều cho phép ký tự gạch chéo trong tên.

2

Khi tình huống này xảy giả đã sử dụng các quy ước tương tự được sử dụng trong các ý kiến ​​tài liệu XML cho C# Generics, đó là sử dụng {} thay vì <> vì dấu ngoặc nhọn là không thân thiện tại một trong hai tên XML hoặc tập tin nhưng những cái xoăn thì có. Vì vậy, một cái gì đó như:

MyClass {T} cs

MyClass {T, K} cs

Nếu bạn thực sự có rất nhiều thông số, mặc dù điều này có thể nhận được phần nào khó sử dụng như một đặt tên lược đồ, vì vậy sau đó tôi có xu hướng áp dụng quy ước CLR của backtick theo sau là số tham số, ví dụ

MyClass`1.cs

MyClass`2.cs

Hoặc trộn và kết hợp hai đề án theo sự phù hợp với tình hình.

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