2016-11-16 51 views
-3

使用關鍵字動態在此方法中有效,如下所示,但我試圖找出一種不使用動態或var的方法。我想使用通用方法。有沒有可以使用的模式或轉換工具?在通用方法中將泛型轉換爲另一種類型

public static TAngle AngleBetween<TAngle>(Vector vector1, Vector vector2) where TAngle : IAngle 
{ 
    dynamic radians = (Radian)AngleBetween(vector1, vector2); 

    return (TAngle)radians; 
} 

這給了想要的結果,但它違反了Liskov的原則:

public static TAngle AngleBetween<TAngle>(Vector vector1, Vector vector2) where TAngle : IAngle 
    { 
     double result = AngleBetween(vector1, vector2); 

     Radian    resultRadian = new Radian(result); 

    Degree    testDegree = new Degree(); 
     DegreeMinuteSecond testDMS  = new DegreeMinuteSecond(); 
     Gradian    testGradian = new Gradian(); 
     Turn    testTurn  = new Turn(); 

     if (typeof(TAngle) == typeof(Degree)) 
     { 
      testDegree = (Degree)resultRadian; 
      return (TAngle)(object)testDegree; 
     } 
     else if (typeof(TAngle) == typeof(DegreeMinuteSecond)) 
     { 
      testDMS = (DegreeMinuteSecond)resultRadian; 
      return (TAngle)(object)testDMS; 
     } 

     else if (typeof(TAngle) == typeof(Gradian)) 
     { 
      testGradian = (Gradian)resultRadian; 
      return (TAngle)(object)testGradian; 
     } 

     else if (typeof(TAngle) == typeof(Turn)) 
     { 
      testTurn = (Turn)resultRadian; 
      return (TAngle)(object)testTurn; 
     } 

     else return (TAngle)(object)resultRadian; 

    } 

有沒有人有什麼建議?

+3

我想我們需要在這裏實現'Radian'和'IAngle'來回答這個問題。 – Jamiec

+2

我懷疑編譯器可以保證'TAngle'永遠是一個'Radian'。如果該方法只能*使用'Radian',那麼爲什麼首先要使用它?只需返回一個'Radian'。 – David

+0

是否有「TAngle」限制? – dymanoid

回答

4

編譯器不能保證,這將永遠是成功的:

TAngle radians = (Radian)AngleBetween(vector1, vector2); 

畢竟,如果TAngle東西以外一個Radian?它的限制是:

where TAngle : IAngle 

但是沒有編譯時保證Radian是永遠不會實現IAngle的唯一的事情。

因此錯誤。

但更重要的是,鑑於此方法的實施,它不應該是通用的。既然你總是要返回Radian,只返回一個Radian

public static Radian AngleBetween(Vector vector1, Vector vector2) 
{ 
    Radian radians = (Radian)AngleBetween(vector1, vector2); 

    return radians; 
} 

或者,如果你想返回一個IAngle,將工作太:

public static IAngle AngleBetween(Vector vector1, Vector vector2) 
{ 
    IAngle radians = (Radian)AngleBetween(vector1, vector2); 

    return radians; 
} 

泛型是有用的,如果什麼可以有多種類型,但是這種實現方式,通過鑄造,堅持使用一種特定的類型。

+0

關於這個用戶將會得到最好的答案作爲目前的問題。 – Jamiec

相關問題