То, что я в основном хочу сделать, разработать универсальный интерфейс, что при реализации, результаты в классе, который может вести себя точно как T, за исключением того, что он имеет некоторую дополнительную функциональность. Вот пример того, о чем я говорю:
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
}
}
И это - все хорошо и хороший, но для использования CoolInt, я должен сделать что-то вроде этого:
CoolInt myCoolInt = new CoolInt(5);
int myInt = myCoolInt.Value;
Я был бы очень скорее с точки зрения присвоения, по крайней мере, что работы CoolInt точно так же, как интервал. Другими словами:
CoolInt myCoolInt = 5;
int myInt = myCoolInt;
Для достижения этого я добавил эти два оператора преобразования к своему классу CoolInt:
public static implicit operator CoolInt(int val)
{
return new CoolInt(val);
}
public static implicit operator int(CoolInt obj)
{
return obj.Value;
}
Работы удивительно. Теперь, я предпочел бы его, если я мог бы добавить эти две перегрузки к интерфейсу, так, чтобы реализаторы интерфейса были вынуждены реализовать эти операторы. Проблема, прототипы этих операторов относятся непосредственно к CoolInt.
C# имеет много названий "заполнителя" вещей, которые неявно определяются или должны все же быть определены. T, который традиционно используется в универсальном программировании, является одним примером. Я предполагаю, что ключевое слово значения, используемое в Свойствах, является другим. "Эту" ссылку можно было считать другим. Я надеюсь, что существует другой символ, который я могу использовать в своем интерфейсе для обозначения "типа класса, который реализует этот интерфейс", например, "реализатора".
public static implicit operator implementer(int val)
{
return new IntVal(val);
}
public static implicit operator int(implementer obj)
{
return obj.Value;
}
Действительно ли это возможно?