Tôi cần một cách để tạo lớp tĩnh trong đó một số hằng số có thể là trường hợp cụ thể, nhưng được mã hóa cứng.lớp trừu tượng tĩnh
Điều tôi thực sự muốn làm là có một lớp nơi một số hằng số được cung cấp khi lớp được mở rộng - Tôi muốn các hằng số được mã hóa cứng. Tôi figured tôi sẽ làm cho một số thuộc tính trừu tượng và xác định get {return constant; } khi mở rộng lớp.
Tôi biết điều đó là không thể, vì vậy bây giờ tôi đang phải đối mặt với hai lựa chọn và đang tự hỏi điều gì sẽ là tốt nhất và tại sao (nếu có những lựa chọn tôi là thiếu xin vui lòng cho tôi biết!)
- Tạo lớp tĩnh với các trường nullable và ném một ngoại lệ nếu các trường là null khi phương thức tĩnh được gọi.
- Bỏ lớp tĩnh. Có một lớp không tĩnh với các thuộc tính trừu tượng và tạo một thể hiện của đối tượng ở bất cứ nơi nào tôi cần nó mặc dù tất cả các chức năng thực sự là tĩnh.
Tôi biết điều này có thể là chủ quan và phụ thuộc vào trường hợp, tuy nhiên tôi đang đi vòng tròn khi nghĩ về điều này và thực sự có thể thực hiện với một số đầu vào bên ngoài. Điều đó cộng với tôi hy vọng có thể có đi làm những gì tôi muốn và tôi chỉ nghĩ về điều này sai.
Cập nhật: Mã: Tôi sẽ cố gắng viết một số mã mô tả những gì tôi muốn thực hiện. Tôi biết mã này không thể hoạt động!
Hãy tưởng tượng rằng lớp trừu tượng Tính toán nằm trong dll, được nhiều dự án sử dụng. Các chức năng là như nhau cho tất cả chúng, chỉ cần Constant thay đổi từ dự án đến dự án.
public abstract static class Calculation
{
private abstract int Constant { get; } //The constant is unknown at this time
public static int Calculate(int inputValue)
{
return inputValue * Constant;
}
}
Lớp Calc được định nghĩa trong một dự án riêng biệt có chức năng cần thiết và Constant được biết.
public static class Calc : Calculation
{
private override int Constant { get { return 2; }
}
...
static class Program
{
[STAThread]
static void Main()
{
//At some point:
int result = Calc.Calculate(6);
}
}
Tôi cho rằng cách đơn giản nhất là tạo ra một lớp học không tĩnh và tạo một thể hiện, tuy nhiên tôi sợ có một số trường hợp của lớp có thể rất tốn kém và muốn ngăn chặn điều đó nếu có thể.
Tôi không thể xem làm thế nào tôi có thể viết này như là một mô hình singleton mà không cần viết nó một lần nữa trong mỗi dự án - chỉ có Nested lớp trong dll. Điều đó không ngăn cản người triển khai tạo một lớp bình thường và có khả năng khởi động lại cuộc tranh luận cho mọi dự án mà mã được sử dụng.
Update # 2:
Class trong một dll::
public static class Calculation
{
public int? Constant {get; set;}
public static int Calculate(int inputValue)
{
if (Constant == null)
throw new ArgumentNullException();
return inputValue * (int)Constant;
}
}
Sử dụng các chức năng trong một dự án riêng biệt:
static class Program
{
[STAThread]
static void Main()
{
//At some point:
Calculation.Constant = 2;
int result = Calc.Calculate(6);
}
}
gì tôi chữa với tùy chọn này là
Tùy chọn một là rất đơn giản và thanh lịch, những gì làm phiền tôi về nó mà không có gì lực lượng người triển khai để đặt Hằng số. Tôi lo sợ một kịch bản (chắc chắn không chắc) nơi một trường hợp góc tối nghĩa sẽ khiến tài sản không được thiết lập và cho mã không thành công (và Liên tục bắt giữ nghi ngờ cuối cùng) ...
Tại sao bạn nghĩ rằng bạn cần một lớp tĩnh? Và bạn có ý nghĩa gì bởi "trường hợp cụ thể, nhưng được mã hóa cứng"? Bạn có thể đăng một ví dụ cụ thể? – svick
Bạn không thể mở rộng (kế thừa) một lớp tĩnh, vì vậy chính xác kịch bản của bạn là gì? Một đoạn mã nhỏ đáng giá 1000 từ. –
Bạn có thể mô tả bằng cách sử dụng một số mẫu - có thể không phải là compoable - mã không? –