2017-04-13 24 views
0

作爲一項技術練習,我嘗試創建不同的方法來計算三角形周長。使用相同的數據類型重載

當給出三條邊時 - 任務很簡單,但當我們得到兩條邊和它們之間的角度或一條邊和兩條邊時 - 我們應該應用一些三角函數操作。

爲了三種情況之間進行區分,我聲明邊緣作爲小數和角度作爲浮子,從而給了系統一提示該方法過載(例如:十進制&浮子&十進制=> 2個邊和一個角度)。

這不是最優雅的解決方案,因爲數據類型不應該用於傳輸信息。 另一種選擇是再添變數,這將獲得價值1或2或3作爲指示什麼的問題類型,但在這種情況下沒有必要對超載..

有沒有一種方法來創建三個重載的方法,每個方法都得到三位小數,並且添加某種方式來表示這三個變量代表什麼(以及使用哪種方法)?

+0

你有任何的代碼嗎? @Geri Reshef – zahed

+1

使用不同類型是正確的方法。使用'decimal'和'float'是錯誤的方法。你應該創建了兩個(不可變的)'struct','Length'和'Angle',可以明確地從'decimal' /'double'轉換爲/。 – xanatos

+0

聽起來像3個不同的函數,應該有3個不同的名字 –

回答

1

使用不同類型是正確的方法。使用decimalfloat是錯誤的方法。您應該創建了兩個(不可變的)結構,LengthAngle,可以明確地向/從decimal/double澆注。

public struct Length 
{ 
    public readonly decimal Value; 

    public Length(decimal length) 
    { 
     Value = length; 
    } 

    public override int GetHashCode() 
    { 
     return Value.GetHashCode(); 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj == null || !(obj is Length)) 
     { 
      return false; 
     } 

     return Value == ((Length)obj).Value; 
    } 

    public override string ToString() 
    { 
     return Value.ToString(); 
    } 

    public static explicit operator Length(decimal value) 
    { 
     return new Length(value); 
    } 

    public static explicit operator decimal(Length length) 
    { 
     return length.Value; 
    } 

    public static Length operator+(Length length1, Length length2) 
    { 
     return new Length(length1.Value + length2.Value); 
    } 
} 

public struct Angle 
{ 
    public readonly decimal Value; 

    public Angle(decimal angle) 
    { 
     Value = angle; 
    } 

    public override int GetHashCode() 
    { 
     return Value.GetHashCode(); 
    } 

    public override bool Equals(object obj) 
    { 
     if (obj == null || !(obj is Angle)) 
     { 
      return false; 
     } 

     return Value == ((Angle)obj).Value; 
    } 

    public override string ToString() 
    { 
     return Value.ToString(); 
    } 

    public static explicit operator Angle(decimal value) 
    { 
     return new Angle(value); 
    } 

    public static explicit operator decimal(Angle angle) 
    { 
     return angle.Value; 
    } 

    public static Angle operator +(Angle angle1, Angle angle2) 
    { 
     return new Angle(angle1.Value + angle2.Value); 
    } 
} 

public static Length Perimeter(Length length1, Length length2, Length length3) 
{ 
    return length1 + length2 + length3; 

    // Or 
    //return new Length(length1.Value + length2.Value + length3.Value); 
} 

用途:

Length length1 = (Length)1.0m; 
Length length2 = (Length)2.0m; 
Length length3 = (Length)3.0m; 
Length perimeter = Perimeter(length1, length2, length3); 

一些注意事項:

  • 我已經(與LengthAngleAngleLength)實施Length/Angleoperator+

  • 命名是可怕的。例如,我會稱它們爲MetersRadians

  • 其他運營商可以很容易地添加(可能是operator-將是有益的),和接口(IComparableIComparable<>IEquatable<>IFormattableISerializable)和其他運營商(==!=<= ...)。

  • 如果重命名結構來MetersRadians,改變ToString()打印的度量單位。

-1

使用命名參數並實現第三個參數作爲可選項。見here

相關問題