Những gì tôi về cơ bản muốn làm là thiết kế một giao diện chung, khi được thực hiện, kết quả trong một lớp có thể hoạt động chính xác như T, ngoại trừ việc nó có một số chức năng bổ sung. Dưới đây là một ví dụ về những gì tôi đang nói về:C# Giao diện: Có thể tham khảo loại thực hiện giao diện trong chính giao diện không?
public interface ICoolInterface<T>
{
T Value { get; set; }
T DoSomethingCool();
}
public class CoolInt : ICoolInterface<int>
{
private int _value;
public CoolInt(int value)
{
_value = value;
}
public int Value
{
get { return _value; }
set { _value = value; }
}
public int DoSomethingCool()
{
return _value * _value;
// Ok, so that wasn't THAT cool
}
}
Và đây là tất cả tốt và tốt, nhưng để sử dụng CoolInt, tôi cần phải làm một cái gì đó như thế này:
CoolInt myCoolInt = new CoolInt(5);
int myInt = myCoolInt.Value;
tôi 'd khá nhiều, về mặt phân công ít nhất, rằng CoolInt hoạt động giống như int. Nói cách khác:
CoolInt myCoolInt = 5;
int myInt = myCoolInt;
Để đạt được điều này, tôi đã thêm hai nhà khai thác chuyển đổi sang lớp CoolInt tôi:
public static implicit operator CoolInt(int val)
{
return new CoolInt(val);
}
public static implicit operator int(CoolInt obj)
{
return obj.Value;
}
Làm việc awesomely. Bây giờ, tôi sẽ thích nếu tôi có thể thêm hai sự quá tải này vào giao diện, để những người triển khai giao diện được buộc để thực hiện các toán tử này. Vấn đề là, các nguyên mẫu của các toán tử này chỉ trực tiếp đến CoolInt.
C# có rất nhiều tên "trình giữ chỗ" cho những thứ được xác định hoàn toàn hoặc chưa được xác định. Chữ T thường được sử dụng trong lập trình chung là một ví dụ. Tôi cho rằng từ khóa giá trị, được sử dụng trong Thuộc tính, là một từ khóa khác. Tham chiếu "này" có thể được coi là khác. Tôi hy vọng rằng có một biểu tượng khác mà tôi có thể sử dụng trong giao diện của mình để biểu thị "loại của lớp đang triển khai giao diện này", ví dụ: "người triển khai".
public static implicit operator implementer(int val)
{
return new IntVal(val);
}
public static implicit operator int(implementer obj)
{
return obj.Value;
}
Điều này có khả thi không?
vâng, nó là lẻ như thế nào nhà điều hành quá tải đôi khi không hoạt động: trong ví dụ chung trừu tượng tôi đăng ở đây nó xuất hiện để làm việc một cách nhưng không phải là khác! –