如果我不能重载函数,那么什么是替代解决方案?

时间:2012-03-04 23:35:24

标签: vb.net primitive-types type-safety

我正在做的是通用的,已经完成了一千次,但我无法弄清楚其他程序员是如何做到的。

我正在使用Sines法则返回A的角度。有两种组合,例如:

  1. 返回角度给定(b侧,a侧,B角)
  2. 返回角度给定(c侧,a侧,角度C)
  3. ----注意:总共有六个,每个角度两个)----

    我无法重载函数,因为签名不是唯一的。参数和返回类型是原始类型Double。

    使用别名可以用来阅读代码,但无法解决我的问题。

    我想到的一种方法是为每个边和角度创建一个结构;但是,我不想创造比所需更多的复杂性。

    另一种解决方案可能是使用策略设计模式吗?

    我是一个业余爱好者程序员(仍处于初级阶段);我正在尝试构建一些优秀的编程实践。任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

可能最好的办法是使用一种方法。您的方法的签名看起来像这样:

Public Function GetAngle(commonSide As Double, commonAngle As Double, otherSide As Double) As Double

您的方法将返回三角形的另一个目标角度。不过,我真的想不起更好的参数名称。

答案 1 :(得分:0)

ASCII艺术时间!

     a
__________
\B      C/
 \      /
c \    / b
   \ A/
    \/

鉴于bB可以与cC进行转置,您只需要三个公式:

  

A =ƒ(a,b,B),必要时转换(b, B) (c, C)
  如果需要,A =ƒ(a,b,C),转换(b, C) (c, B)   A =ƒ(b,c,B),必要时转换(B) (C)

鉴于这些都有两个长度和一个角度,你需要三个不同的方法名称:

GetAngleFromOppositeLineAndLooseAngle(oppositeLine , adjacentLine , looseAngle)
GetAngleFromOppositeLineAndJointAngle(oppositeLine , adjacentLine , jointAngle)
GetAngleFromAdjacentLines            (adjacentLine1, adjacentLine2, looseAngle)

否则,是的,你必须通过一个结构并辨别丢失的信息。使用Nullable(Of Double)Double.NaN传递未知值。

答案 2 :(得分:0)

我建议使用不同的命名约定和布尔参数:

Public Function GetAngle(adjacentSide As Double, oppositeSide As Double, knownAngle As Double, Optional knownAngleCorrespondsToAdjacentSide As Boolean = True) As Double

当被叫时,你现在知道它是否是:

GetAngle(c, a, C)           'or
GetAngle(b, a, B)           'or
GetAngle(b, a, C, False)    'or
GetAngle(c, a, B, False)

那说,因为A,B和& C是任意标签:

     a                   b                   c    
__________          __________          __________
\B      C/          \C      A/          \A      B/
 \      /            \      /            \      /
c \    / b    =>    a \    / c    =>     b\    / a
   \ A/                \ B/                \ C/
    \/                  \/                  \/

你需要两个函数(Private可以正常工作)或者只是根据布尔值在内部处理你的计算:

Public Function GetAngle(adjacentSide As Double, oppositeSide As Double, knownAngle As Double, Optional knownAngleCorrespondsToAdjacentSide As Boolean = True) As Double
    If knownAngleCorrespondsToAdjacentSide Then
        'Calculate one way
        ' or call private method
    Else
        'Calculate the other
        ' or call the other private method
    End If

    Return calculatedAngle
End Function