2011-05-10 7 views
12

저는 각각의 파생 된 구체적인 클래스가 아닌 추상적 인 기본 클래스에서 게으르다가 구현하려고합니다. 나는 한 방향으로 던져 봤지만 다른 쪽은 던질 수 없다. 나는 그것이 가능하지 않을 수도 있지만, 포기하기 전에 집단적 마음을 골라 내고 싶다고 생각한다 :일반 추상 클래스에서 캐스트 연산자를 구현하십시오.

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

부분은 반영이 할 수 있다고 생각하지만, 나 대부분을 말한다 파생 된 클래스에서 그것을하는 것이 더 합리적입니다. 왜냐하면 개별 파생 된 클래스가 T에서 작업하는 방법을 알기 위해서이기 때문에, T의 작업이 아니라 그는 추상적 인 수업. –

+0

사실, 나는 정적 인 방법이고, 필요한 인스턴스 방법이 무엇인지 생각하고 있었기 때문에, 당신이 반영으로도 그것을 할 수 있다고 생각하지 않습니다. –

+0

@Matt Ellen 필자는 구체적인 클래스에서 그것을하는 것이 더 낫다는 것에 동의하지만, 수십 개의 파생 클래스에 복사하는 것이 아니라 한 번 작성하는 것이 좋습니다. –

답변

10

구체 유형을 식별하기 위해 다른 일반 매개 변수를 소개해야한다.

뭔가 같은 ..

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

나는 여전히'int'를'Test'로 명시 적으로 캐스팅해야한다는 것을 알고 있습니다 :'Test t2 = (Test) 6;'. 필자는 컴파일 타임 오류 (CS0556)없이 'public static implicit operator K (T val) {...}'을 구현할 수 없기 때문입니다. –

+0

암시 적 연산자를 연결하는 솔루션을 생각했지만 거기에 붙어 있습니다. http://stackoverflow.com/questions/6001854/chaining-implicit-operators-in-generic-c-classes –

관련 문제