2011-05-10 11 views
12

Tembel olmaya çalışıyorum ve döküm operatörlerini, türetilen somut sınıfların her biri yerine soyut temel sınıfta uygularım. Bir yol açmayı başardım, ama diğerini atayamadım. Bunun mümkün olmayabilir düşünüyorum, ama kolektif SO vazgeçmeden önce akla almak istedim:Bir jenerik özet sınıfında bir cast işleci uygulamak

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; 
    } 
} 
+0

parçası da yansıma ile bu yapabileceğini düşünür, ama beni en çok diyor türetilmiş sınıflarda bunu yapmak için daha mantıklıdır, çünkü bu türün işi değil, T'den nasıl gidileceğini bilmesi bireysel türetilmiş sınıfın işidir. o soyut sınıf. –

+0

Aslında, statik yöntemlerle ve gerekli olan örnek yöntemlerini düşündüğüm için yansıma ile bile yapabileceğinizi sanmıyorum. –

+0

@Matt Ellen Beton derslerinde bunu yapmanın daha iyi olacağına katılıyorum, ancak yöntemi bir zamanlar düzinelerce türetilmiş sınıflara kopyalamak yerine yazmayı tercih ediyorum. –

cevap

10

Sen beton türünü tanımlamak için başka jenerik parametreyi uygulamaya koyması gerekmektedir.

gibi bir şey ..

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;  
    } 
} 

oluşturma beton sınıfı

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

Gözümün

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

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

Açıkçası hala bir "int" olan "Test": "Test t2 = (Test) 6;". Bunun nedeni, bir derleme zamanı hatası (CS0556) oluşmadan 'public static implicit operator K (T val) {...} 'uygulayamayız. –

+0

Kapalı operatörleri zincirleme bir çözüm düşündüm ama orada sıkışmış, bkz: http://stackoverflow.com/questions/6001854/chaining-implicit-operators-in-generic-c-classes –