Tình hìnhAlternatives để typedef hoặc chuỗi subclassing trong C#
tôi có lớp học mà những giao dịch trong nội bộ với nhiều loại khác nhau của đường dẫn tập tin: một số địa phương, một số từ xa; một số người thân, một số tuyệt đối.
Nó từng là trường hợp nhiều phương pháp của nó truyền chúng xung quanh với nhau là string
s, nhưng rất khó để theo dõi chính xác loại đường dẫn mà mỗi phương thức mong đợi.
Việc sửa chữa mong muốn
Vì vậy, chúng tôi chủ yếu muốn typedef
bốn loại khác nhau để string
: RemoteRelative
, LocalRelative
, RemoteAbsolute
, và LocalAbsolute
. Bằng cách này, trình kiểm tra loại tĩnh có thể giúp nhà phát triển đảm bảo rằng họ đang cung cấp và mong đợi string
s với ngữ nghĩa chính xác.
Thật không may, string
là sealed
trong BCL, vì vậy chúng tôi không thể thực hiện việc này với kế thừa đơn giản. Và không có đơn giản typedef
, vì vậy chúng tôi cũng không thể làm theo cách đó.
Việc sửa chữa thực tế
tôi đã kết thúc việc tạo ra bốn lớp đơn giản khác nhau mà mỗi chứa một readonly string
.
public struct LocalAbsolutePath {
public readonly string path;
public LocalAbsolutePath(string path) {
this.path = path;
}
}
Điều đó chủ yếu là hoạt động, nhưng nó kết thúc bằng cách thêm một chút độ dài không mong muốn.
Câu hỏi: Tôi có thấy bất kỳ lựa chọn thay thế nào phù hợp tự nhiên với cú pháp C# đơn giản không?
Như tôi đã đề cập ở trên, kiểu C typedef string LocalAbsolutePath;
hoặc thậm chí kiểu F # type LocalAbsolutePath = string
sẽ là ước mơ của tôi ở đây. Nhưng ngay cả một cái gì đó là một bước mà hướng từ các lớp học tùy chỉnh sẽ là tuyệt vời.
không là nó có thể tìm thấy một mô hình phổ biến phù hợp với cách? Ví dụ: nếu đường dẫn tuyệt đối, phải có một số ký tự ổ đĩa trước, nếu không, nó * phải * là tương đối, tương tự cho đường dẫn mạng ... – Tigran
@Tigran, hoàn toàn có, nhưng đó là vấn đề trong lần đầu tiên địa điểm. Tôi muốn _compiler_ có thể biết được liệu chúng ta có truyền đi đúng loại không, không phải là thời gian chạy. – sblom
Về cơ bản lấy mã của tôi và @ dasblinkenlight cùng nhau và bạn có cho mình một lớp học. :) –