реализация оператора приведения в общем абстрактном классе - PullRequest
13 голосов
/ 10 мая 2011

Я пытаюсь быть ленивым и реализовать операторы приведения в абстрактном базовом классе, а не в каждом из производных конкретных классов.Мне удалось разыграть одну сторону, но я не могу разыграть другую.Я думаю, что это не могло быть возможно, но я хотел выбрать коллективный ТАК, прежде чем сдаться:

public interface IValueType<T>
{
    T Value{ get; set; }
}

public abstract class ValueType<T> : IValueType<T> {
    public abstract T Value { get; set; }
    public static explicit operator T(ValueType<T> vt) {
        if(vt == null)
            return default(T);
        return vt.Value;
    }

    public static implicit operator ValueType<T>(T val) {
        ValueType<T> vt = new ValueType<T>(); //<--- obviously this won't work as its abstract
        vt.Value = val;
        return vt;
    }
}

1 Ответ

9 голосов
/ 10 мая 2011

Вам необходимо ввести еще один универсальный параметр для определения конкретного типа.

что-то вроде ..

public interface IValueType<T> 
{    
    T Value{ get; set; } 
} 

public abstract class ValueType<T,K> : 
    IValueType<T> where K : ValueType<T,K>,new()
{     
    public abstract T Value { get; set; }     
    public static explicit operator T(ValueType<T,K> vt) 
    {         
        if(vt == null)            
            return default(T);         
        return vt.Value;     
    }      

    public static implicit operator ValueType<T,K>(T val) 
    {         
        K k = new K();
        k.Value = val;
        return k;    
    } 
} 

Создать свой конкретный класс

public class Test : ValueType<int,Test>
{
    public override int Value {get;set;}
}

Тогда

var t = new Test();
t.Value = 99;
int i = (int)t;
Test t2 = (Test)6;

Console.WriteLine(i);
Console.WriteLine(t2);
...