Что я в основном хочу сделать, так это разработать общий интерфейс, который при реализации приводит к классу, который может вести себя точно так же, как 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 работает так же, как int.Другими словами:
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, который обычно используется в универсальном программировании, является одним из примеров.Я предполагаю, что ключевое слово value, используемое в свойствах, является другим.«Эту» ссылку можно считать другой.Я надеюсь, что есть еще один символ, который я могу использовать в своем интерфейсе для обозначения «типа класса, реализующего этот интерфейс», например «реализатор».
public static implicit operator implementer(int val)
{
return new IntVal(val);
}
public static implicit operator int(implementer obj)
{
return obj.Value;
}
Возможно ли это?