【问题标题】:Overloading with the same data types重载相同的数据类型
【发布时间】:2017-04-13 08:16:00
【问题描述】:

作为一项技术练习,我尝试创建不同的方法来计算三角形周长。

当给出三个边时——任务很简单, 但是当我们得到两条边和它们之间的角度或一条边和它的两条边时 - 我们应该应用一些三角运算。

为了区分这三种情况,我将边声明为小数,将角度声明为浮点数,从而给系统提示哪些方法要重载(例如:十进制 & 浮点数 & 十进制 => 2 条边和一个角度)。

这不是最优雅的解决方案,因为不应该使用数据类型来传输信息。 另一种选择是添加另一个变量,该变量将获得值 1 或 2 或 3 来指示问题的类型,但在这种情况下不需要重载..

有没有办法创建三个重载方法,每个方法都有三位小数,并以某种方式添加一个指示三个变量象征什么(以及使用哪种方法)?

【问题讨论】:

  • 你有代码吗? @Geri Reshef
  • 使用不同的类型是正确的方法。使用decimalfloat 是错误的方式。您应该已经创建了两个(不可变的)structLengthAngle,可显式转换为 /decimal/double
  • 听起来像是 3 个不同的函数,应该有 3 个不同的名称

标签: c# operator-overloading


【解决方案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);

一些注意事项:

  • 我在Length/Angle 中实现了operator+LengthLengthAngleAngle)。

  • 命名很糟糕。例如,我会称他们为MetersRadians

  • 1234563 (==!=<=...)。
  • 如果将结构重命名为 MetersRadians,请更改 ToString() 以打印度量单位。

【讨论】:

    【解决方案2】:

    使用命名参数并将第三个参数实现为可选。见here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 2012-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多